![]() ![]() | ![]() |
minor bug bei AuflĂsung existierender refs.
1: 2: 3: """New version of the product started February, 8th. Without scientific classification, use content-type for further classification.""" 4: """Echo collection provides the classes for the ECHO content web-site. 5: 6: class ECHO_collection is the basis class for an ECHO collection. 7: 8: class ECHO_resource contains information on ECHO resources (e.g. an Display environment for Metadata 9: 10: class ECHO_externalLink contains information on externalLinks 11: 12: 13: """ 14: try: 15: from reportlab.pdfgen import canvas 16: from reportlab.lib.pagesizes import A4 17: except: 18: print "PDF generation will not work" 19: 20: 21: import string 22: import tempfile 23: import re 24: import os 25: import OFS.Image 26: from types import * 27: from OFS.Cache import Cacheable 28: from OFS.Image import Image 29: from Globals import DTMLFile 30: from OFS.Folder import Folder 31: from OFS.SimpleItem import SimpleItem 32: from AccessControl import ClassSecurityInfo 33: from AccessControl.User import UserFolder 34: from Globals import InitializeClass 35: from Globals import DTMLFile 36: import Globals 37: from Products.PageTemplates.PageTemplateFile import PageTemplateFile 38: from Products.PageTemplates.PageTemplate import PageTemplate 39: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate 40: from Globals import Persistent, package_home 41: from Acquisition import Implicit 42: 43: import urllib 44: import cgi 45: import smtplib 46: import time 47: from Ft.Xml.Domlette import NonvalidatingReader 48: from Ft.Xml.Domlette import PrettyPrint 49: from Ft.Xml import EMPTY_NAMESPACE 50: 51: import Ft.Xml.XPath 52: import cStringIO 53: import zLOG 54: 55: try: 56: from psycopg import libpq 57: except: 58: try: 59: from pyPgSQL import libpq 60: except: 61: print "ECHO_collection: Warning - No libpq imported!" 62: 63: import xml.dom.minidom 64: 65: import urllib 66: import xml.dom.minidom 67: import ECHO_helpers 68: from ECHO_helpers import * 69: from ECHO_language import * 70: from ECHO_movie import * 71: 72: #regexp for extracting elements from xml 73: patternTXT=r"<\s*txt.*?>(.*?)</txt>" 74: regexpTXT = re.compile(patternTXT, re.IGNORECASE + re.DOTALL) 75: patternPage=r"<\s*page.*?>(.*?)</page>" 76: regexpPage = re.compile(patternPage, re.IGNORECASE + re.DOTALL) 77: 78: 79: 80: def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""): 81: 82: """Allegemeine Informationen zu einer ECHO Collection""" 83: 84: self.label = label 85: self.title=title 86: self.description=description 87: self.contentType=contentType 88: self.responsible=responsible 89: self.credits=toList(credits) 90: self.weight=weight 91: 92: class ECHO_locale(ZopePageTemplate): 93: """localisierung""" 94: 95: meta_type="ECHO_locale" 96: 97: def __init__(self,id,lang,title,label,text=None,content_type=None): 98: self.lang=lang 99: self.title=title 100: self.label=label 101: if text: 102: self.pt_edit(text, content_type) 103: self.id=id 104: 105: manage_options = ZopePageTemplate.manage_options+( 106: {'label':'Main Config','action':'change_ECHO_localeForm'}, 107: ) 108: 109: def change_ECHO_localeForm(self): 110: """change form""" 111: pt=zptFile(self, 'zpt/ChangeECHO_localeForm.zpt') 112: return pt() 113: 114: def change_ECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None): 115: """change echo locale""" 116: self.lang=lang 117: self.title=title 118: self.label=label 119: if not text is None: 120: self.pt_edit(text, content_type) 121: 122: if RESPONSE is not None: 123: RESPONSE.redirect('manage_main') 124: 125: 126: def manage_addECHO_localeForm(self): 127: """Form for adding""" 128: pt=zptFile(self, 'zpt/AddECHO_localeForm.zpt') 129: return pt() 130: 131: def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None): 132: """add echo locale""" 133: 134: id="locale_"+lang 135: 136: self._setObject(id, ECHO_locale(id,lang,title,label,text,content_type)) 137: if RESPONSE is not None: 138: RESPONSE.redirect('manage_main') 139: 140: 141: class ECHO_copyright(Folder,ECHO_basis): 142: """Copyright informationen""" 143: meta_type="ECHO_copyright" 144: 145: 146: 147: def __init__(self,id,title,copyrights): 148: """init""" 149: self.title=title 150: self.id=id 151: self.copyrights=copyrights[0:] 152: 153: def getCopyrights(self): 154: """return coyprights""" 155: return self.copyrights 156: 157: manage_options = Folder.manage_options+( 158: {'label':'Main Config','action':'ECHO_copyright_configForm'}, 159: ) 160: 161: 162: def ECHO_copyright_configForm(self): 163: """change form""" 164: pt=zptFile(self, 'zpt/ChangeECHO_copyright') 165: pt.content_type="text/html" 166: return pt() 167: 168: def ECHO_copyright_config(self,title,RESPONSE=None): 169: """change""" 170: self.title=title 171: self.copyrights=[] 172: self.copyrights=getCopyrightsFromForm(self,self.REQUEST.form)[0:] 173: 174: if RESPONSE is not None: 175: RESPONSE.redirect('manage_main') 176: 177: 178: def manage_addECHO_copyrightForm(self): 179: """Form for adding""" 180: pt=zptFile(self, 'zpt/AddECHO_copyright.zpt') 181: return pt() 182: 183: def manage_addECHO_copyright(self, id,title,RESPONSE=None): 184: """add the copyright""" 185: 186: meta_type="ECHO_copyright" 187: 188: #first generate copyrights as list of tripels (mediaType,partner,copyrightType) 189: 190: 191: 192: self._setObject(id, ECHO_copyright(id, title,getCopyrightsFromForm(self,self.REQUEST.form))) 193: 194: if RESPONSE is not None: 195: RESPONSE.redirect('manage_main') 196: 197: class ECHO_layoutTemplate(ZopePageTemplate,ECHO_basis): 198: """Create a layout Template for different purposes""" 199: 200: meta_type="ECHO_layoutTemplate" 201: 202: def __init__(self, id, text=None, content_type=None,EchoType=None): 203: self.id = str(id) 204: 205: self.ZBindings_edit(self._default_bindings) 206: if text is None: 207: self._default_content_fn = os.path.join(package_home(globals()),'zpt','ECHO_%s_template_standard.zpt'%EchoType) 208: text = open(self._default_content_fn).read() 209: self.pt_edit(text, content_type) 210: 211: 212: def manage_addECHO_layoutTemplateForm(self): 213: """Form for adding""" 214: pt=zptFile(self, 'zpt/AddECHO_layoutTemplate.zpt') 215: return pt() 216: 217: 218: def manage_addECHO_layoutTemplate(self, EchoType,title=None,REQUEST=None): 219: "Add a Page Template with optional file content." 220: if type(EchoType)==StringType: 221: EchoTypes=[EchoType] 222: else: 223: EchoTypes=EchoType 224: 225: for singleType in EchoTypes: 226: 227: id = str(singleType)+"_template" 228: if REQUEST is None: 229: self._setObject(id, ECHO_layoutTemplate(id, text,EchoType=singleType)) 230: ob = getattr(self, id) 231: 232: if title: 233: ob.pt_setTitle(title) 234: return ob 235: else: 236: file = REQUEST.form.get('file') 237: headers = getattr(file, 'headers', None) 238: if headers is None or not file.filename: 239: zpt = ECHO_layoutTemplate(id,EchoType=singleType) 240: else: 241: zpt = ECHO_layoutTemplate(id, file, headers.get('content_type')) 242: 243: self._setObject(id, zpt) 244: ob = getattr(self, id) 245: if title: 246: ob.pt_setTitle(title) 247: 248: try: 249: u = self.DestinationURL() 250: except AttributeError: 251: u = REQUEST['URL1'] 252: 253: 254: REQUEST.RESPONSE.redirect(u+'/manage_main') 255: return '' 256: 257: class ECHO_fullText(ZopePageTemplate,ECHO_basis,ECHO_language): 258: """echo fulltext in xml""" 259: 260: meta_type="ECHO_fullText" 261: 262: 263: def getPage(self,nr='1'): 264: """get page n""" 265: #return self().encode('latin-1','ignore') 266: dom=xml.dom.minidom.parseString(self().encode('utf-8','ignore')) 267: pages=dom.getElementsByTagName('page') 268: 269: return pages[int(nr)-1].toxml() 270: 271: # Product registration and Add support 272: manage_addECHO_fullTextForm = PageTemplateFile( 273: 'zpt/AddECHO_fullText.zpt', globals()) 274: 275: def manage_addECHO_fullText(self, id, title=None, text=None, 276: REQUEST=None, submit=None): 277: "Add a Page Template with optional file content." 278: 279: id = str(id) 280: if REQUEST is None: 281: self._setObject(id, ECHO_fullText(id, text)) 282: ob = getattr(self, id) 283: if title: 284: ob.pt_setTitle(title) 285: return ob 286: else: 287: file = REQUEST.form.get('file') 288: headers = getattr(file, 'headers', None) 289: if headers is None or not file.filename: 290: zpt = ECHO_fullText(id) 291: else: 292: zpt = ECHO_fullText(id, file, headers.get('content_type')) 293: 294: self._setObject(id, zpt) 295: 296: try: 297: u = self.DestinationURL() 298: except AttributeError: 299: u = REQUEST['URL1'] 300: 301: if submit == " Add and Edit ": 302: u = "%s/%s" % (u, urllib.quote(id)) 303: REQUEST.RESPONSE.redirect(u+'/manage_main') 304: return '' 305: 306: 307: class ECHO_resource(Folder,Persistent,ECHO_basis): 308: """ECHO Ressource""" 309: security=ClassSecurityInfo() 310: meta_type='ECHO_resource' 311: 312: # viewClassificationList=viewClassificationListMaster 313: 314: getSubCols = ECHO_helpers.getSubCols 315: 316: 317: security.declareProtected('View','createPDF') 318: def createPDF(self,RESPONSE=None,local=None,dpi=150): 319: """erzeuge pdf file""" 320: pages=1 321: dpi=float(dpi) 322: imagePath=self.getImagePath().replace("/mpiwg/online","") 323: 324: 325: image="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler?fn="+imagePath+"&dw=%i&dh=%i&pn=%i" 326: xmlInfo="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/dlInfo-xml.jsp?fn="+imagePath 327: 328: dom=xml.dom.minidom.parse(urllib.urlopen(xmlInfo)) 329: for parameter in dom.getElementsByTagName('parameter'): 330: if parameter.getAttribute('name')=="pt": 331: pages=int(parameter.getAttribute('value')) 332: break 333: 334: 335: tempdir="/tmp/archivesImageServer" 336: if not os.path.exists(tempdir): 337: os.mkdir(tempdir) 338: 339: tmpPath=tempfile.mkdtemp(dir=tempdir) 340: 341: 342: tmpZip=tempfile.mktemp(dir=tempdir) 343: 344: tmpFn=os.path.split(tmpZip)[1] 345: 346: 347: 348: 349: if RESPONSE: 350: RESPONSE.setHeader("Content-Type","text/html") 351: RESPONSE.write("<h1>I am creating the pdf</h1>") 352: txt="<h3>1. step: getting the images( %i pages)</h3>"%pages 353: RESPONSE.write(txt) 354: 355: c=canvas.Canvas(tmpZip) 356: for i in range(1,pages+1): 357: if RESPONSE: 358: RESPONSE.write(str("<p>Get Page: %i<br>\n"%i)) 359: faktor=dpi/72.0 360: 361: fn=tmpPath+"/%i"%i 362: 363: width,height=A4 364: #print image%(width*faktor,height*faktor,i) 365: url=urllib.urlopen(image%(width*faktor,height*faktor,i)).read() 366: fh=file(fn,"w") 367: fh.write(url) 368: fh.close() 369: 370: 371: 372: c.drawImage(fn,0,0,width=width,height=height) 373: c.showPage() 374: c.save() 375: if RESPONSE: 376: RESPONSE.write("<p>finished<br>\n") 377: 378: if RESPONSE: 379: len=os.stat(tmpZip)[6] 380: downloadUrl=self.absolute_url()+"/downloadPDF" 381: RESPONSE.write("""<h1><a href="downloadPDF?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len)) 382: RESPONSE.write("""<p>The file will be stored for a while, you can download it later, the URL is:</p> 383: <p><a href="downloadPDF?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn)) 384: RESPONSE.close() 385: 386: 387: def downloadPDF(self,fn): 388: """download prepared set""" 389: filename="/tmp/archivesImageServer/"+fn 390: namePDF=self.getId()+".pdf" 391: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%namePDF) 392: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream") 393: len=os.stat(filename)[6] 394: self.REQUEST.RESPONSE.setHeader("Content-Length",len) 395: images=file(filename).read() 396: self.REQUEST.RESPONSE.write(images) 397: self.REQUEST.RESPONSE.close() 398: 399: 400: def getRDF(self,urn=None): 401: """rdf""" 402: ret=getRDFDescription(self,self.link,urn=urn) 403: return ret+self.createSubElementRDF(urn=urn) 404: 405: 406: def getAccessRightSelectorHTML(self,outlook="select"): 407: """htmlselector""" 408: values=['free','mpiwg'] 409: 410: if outlook=="select": 411: ret="""<select name="%s">"""%self.getId() 412: 413: for value in values: 414: if value==self.getAccessRightMD(): 415: ret+="<option selected>%s</option>"%value 416: else: 417: ret+="<option>%s</option>"%value 418: return ret+"</select>" 419: 420: else: 421: ret="" 422: for value in values: 423: 424: if value==self.getAccessRightMD(): 425: ret+="""<input type="radio" name="%s" value="%s" checked>%s"""%(self.getId(),value,value) 426: else: 427: ret+="""<input type="radio" name="%s" value="%s">%s"""%(self.getId(),value,value) 428: return ret 429: 430: 431: 432: def getAccessRightMD(self): 433: """set accessright""" 434: url=self.metalink 435: 436: try: 437: geturl="" 438: for line in ECHO_helpers.urlopen(url).readlines(): 439: geturl=geturl+line 440: 441: 442: except: 443: return (None,"Cannot open: "+url) 444: 445: try: 446: dom=xml.dom.minidom.parseString(geturl) 447: root=dom.getElementsByTagName('resource')[0] 448: except: 449: return (None,"Cannot parse: "+url+"<br>"+geturl) 450: 451: internal=dom.getElementsByTagName('internal') 452: if internal: 453: institution=dom.getElementsByTagName('institution') 454: return getText(institution[0].childNodes) 455: 456: free=dom.getElementsByTagName('free') 457: if free: 458: return "free" 459: 460: return "free" #default free 461: 462: def changeAccessRightMD(self,accessright,RESPONSE=None): 463: """change the rights""" 464: 465: params="accessright=%s"%accessright 466: 467: 468: #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read() 469: 470: 471: ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/setAccessRightXML'+urllib.quote('?'+params))).read() 472: 473: 474: if RESPONSE is not None: 475: RESPONSE.redirect('manage_main') 476: 477: 478: def setAccessRightXML(self,accessright): 479: """set accessright""" 480: url=self.metalink 481: 482: try: 483: geturl="" 484: for line in ECHO_helpers.urlopen(url).readlines(): 485: geturl=geturl+line 486: 487: 488: except: 489: return (None,"Cannot open: "+url) 490: 491: try: 492: dom=xml.dom.minidom.parseString(geturl) 493: root=dom.getElementsByTagName('resource')[0] 494: except: 495: return (None,"Cannot parse: "+url+"<br>"+geturl) 496: 497: metanodes=dom.getElementsByTagName('access-conditions') 498: 499: if not metanodes: 500: nodenew=dom.createElement('access-conditions') 501: root.appendChild(nodenew) 502: metanode=nodenew 503: else: 504: metanode=metanodes[0] 505: 506: accesses=metanode.getElementsByTagName('access') 507: 508: if not accesses: 509: nodenew2=dom.createElement('access') 510: metanode.appendChild(nodenew2) 511: metanode2=nodenew2 512: else: 513: metanode2=accesses[0] 514: 515: internal=metanode.getElementsByTagName('internal') 516: 517: if internal: 518: metanode2.removeChild(internal[0]).unlink() 519: 520: free=metanode.getElementsByTagName('free') 521: 522: if free: 523: metanode2.removeChild(internal[0]).unlink() 524: 525: 526: if accessright=='free': 527: nodenew3=dom.createElement('free') 528: metanode2.appendChild(nodenew3) 529: elif accessright=='mpiwg': 530: nodenew3=dom.createElement('internal') 531: nodenew4=dom.createElement('institution') 532: metanodetext=dom.createTextNode('mpiwg') 533: nodenew4.appendChild(metanodetext) 534: nodenew3.appendChild(nodenew4) 535: metanode2.appendChild(nodenew3) 536: 537: return dom.toxml().encode('utf-8') 538: 539: def setStartPageForm(self): 540: """Form for changing the startpage""" 541: 542: 543: pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPage.zpt') 544: pt.content_type="text/html" 545: return pt() 546: 547: 548: def createImageUrl(self,pn=1): 549: """create ImageUrl""" 550: 551: 552: resourcepath=readFieldFromXML(self.metalink,'resource','archive-path') 553: 554: digiliburlprefix=readFieldFromXML(self.metalink,'texttool','digiliburlprefix') 555: images=readFieldFromXML(self.metalink,'texttool','image') 556: 557: 558: if (not resourcepath) or (not digiliburlprefix) or (not images): 559: zLOG.LOG("ECHO (createImageUrl)",zLOG.ERROR,"Cannot create ImageUrl for %s"%self.absolute_url()) 560: return None 561: resourcepath=resourcepath.replace('/mpiwg/online','') 562: if not digiliburlprefix: digiliburlprefix="http://echo.mpiwg-berlin.mpg.de/zogilib?" 563: 564: if (not images) or (not resourcepath): return None 565: 566: return "%sfn=%s&pn=%i"%(digiliburlprefix,resourcepath+"/"+images,pn) 567: 568: def copyTitleToInfoXML(self,RESPONSE=None): 569: """copy title from the resource""" 570: presentationXML=readFieldFromXML(self.metalink,'texttool','presentation') 571: resourcepath=readFieldFromXML(self.metalink,'resource','archive-path') 572: if (not presentationXML) or (not resourcepath): 573: if RESPONSE: 574: RESPONSE.write("Error: %s\n"%self.getId()) 575: else: 576: return None,self.absolute_url() 577: 578: try: 579: fh=file(os.path.join(resourcepath,presentationXML),'w') 580: fh.write("""<info> 581: <author></author> 582: <title>%s</title> 583: <date></date> 584: <display>yes</display> 585: </info>"""%self.title) 586: fh.close() 587: return 1,self.getId() 588: except: 589: if RESPONSE: 590: RESPONSE.write("Error: %s\n"%self.getId()) 591: else: 592: return None,self.absolute_url() 593: 594: 595: def setStartPage(self,startpage=None,RESPONSE=None): 596: """set start page, if no startpage defined use the generic one of the resource""" 597: 598: if (not (type(startpage)==StringType)): 599: if ("__generic" in startpage): # checke ob generic in der liste 600: startpage=self.absolute_url()+"/startpage_html" 601: elif ("__firstPage" in startpage): # checke ob generic in der liste 602: startpage=self.createImageUrl() 603: 604: if (not startpage): 605: startpage=self.absolute_url()+"/startpage_html" 606: elif (startpage=="__generic"): 607: startpage=self.absolute_url()+"/startpage_html" 608: elif (startpage=="__firstPage"): 609: startpage=self.createImageUrl() 610: 611: params="startpage=%s"%startpage 612: #print 'http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params)) 613: 614: ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read() 615: 616: 617: path=self.metalink 618: 619: path=re.sub(self.REQUEST['SERVER_URL'],'',path) 620: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path) 621: 622: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server 623: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server 624: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server 625: path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server 626: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server 627: path=re.sub('http://vision.mpiwg-berlin.mpg.de','',path) # falls vision als server 628: path=re.sub('http://xserve02.mpiwg-berlin.mpg.de:18880','',path) # falls vision als server 629: path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo 630: path=re.sub('/index.meta','',path) 631: 632: 633: ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines() 634: 635: if RESPONSE is not None: 636: RESPONSE.redirect('manage_main') 637: 638: def changeViewerTemplateSetForm(self): 639: """change the viewer template set""" 640: pt=zptFile(self, 'zpt/changeResourceViewerTemplateSet') 641: return pt() 642: 643: 644: 645: def getTextToolsField(self,name,default=''): 646: """Lese Textoolsfelder aus index.meta im path aus""" 647: 648: try: 649: dom=xml.dom.minidom.parse(self.metalink) 650: node=dom.getElementsByTagName('texttool')[0] #getNode 651: subnode=node.getElementsByTagName(name)[0] 652: 653: # bei text wird nur der Folder gebraucht 654: if name=="text": 655: splitted=getText(subnode.childNodes).split("/") 656: return splitted[len(splitted)-2] 657: else: 658: return getText(subnode.childNodes) 659: except: 660: return default 661: 662: 663: def changeViewerTemplateSet(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None): 664: """changeit""" 665: 666: paramList=['project','startpage','xslt','thumbtemplate','topbar','digiLibTemplate','digiliburlprefix'] 667: 668: 669: #writeMetadata(self.metalink,self.metaDataHash,project,None,xslt,thumbtemplate,topbar,digiLibTemplate) 670: 671: params="project=%s&xslt=%s&thumbtemplate=%s&topbar=%s&digiLibTemplate=%s&digiliburlprefix=%s"%(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix) 672: 673: 674: ECHO_helpers.urlopen('http://echo.mpiwg-berlin.mpg.de/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML'+urllib.quote('?'+params))).read() 675: 676: #print self.absolute_url()+'/newMetaXML'+urllib.quote'?'+params) 677: # hack Pfad auf die Dokumente 678: path=self.metalink 679: 680: 681: 682: path=re.sub('/index.meta','',path) 683: 684: path=re.sub(self.REQUEST['SERVER_URL'],'',path) 685: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path) 686: 687: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server 688: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server 689: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server 690: 691: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server 692: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server 693: path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server 694: path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo 695: 696: path=re.sub('http://vision.rz-berlin.mpg.de','',path) # falls vision als server 697: 698: return ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines() 699: 700: 701: if RESPONSE is not None: 702: RESPONSE.redirect('manage_main') 703: 704: 705: 706: security.declarePublic('content_html') 707: def content_html(self): 708: """template fuer content""" 709: return ECHO_basis.content_html(self,'resource') 710: 711: # def getViewClassification(self): 712: # if hasattr(self,'viewClassification'): 713: # return self.viewClassification 714: # else: 715: # return "" 716: 717: def getFullTextXML(self,noredirect=None): 718: """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong.""" 719: 720: try: 721: #zLOG.LOG("ECHO Fulltext",zLOG.INFO,"open %s"%self.metalink) 722: fh=ECHO_helpers.urlopen(self.metalink) 723: #zLOG.LOG("ECHO Fulltext",zLOG.INFO,"opened %s"%self.metalink) 724: dom=xml.dom.minidom.parse(fh) 725: texttools=dom.getElementsByTagName('texttool') 726: text=texttools[0].getElementsByTagName('text') 727: texturl=getText(text[0].childNodes) 728: 729: #zLOG.LOG("ECHO Fulltext",zLOG.INFO,"found %s"%texturl) 730: fh.close() 731: #zLOG.LOG("ECHO Fulltext",zLOG.INFO,"closed fh") 732: #keine url 733: if not (texturl.split(":")[0] in ['http','ftp','file']): 734: if not noredirect: 735: return file(texturl).read() 736: else: 737: return texturl 738: 739: if not noredirect: 740: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') 741: zLOG.LOG("ECHO Fulltext",zLOG.INFO,"redirect to:%s"%texturl) 742: self.REQUEST.RESPONSE.redirect(texturl) 743: else: 744: return texturl 745: except: 746: 747: if not noredirect: 748: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') 749: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>") 750: else: 751: return "<error>no fulltext available</error>" 752: 753: def getImagePath(self): 754: """gibt pfad zum image aus""" 755: return self.getImageView(noredirect="yes",onlyPath="yes") 756: 757: def getImageView(self,noredirect=None,onlyPath=None): 758: """getImages; give Imageviewr and <error></error> if somthing goes wrong.""" 759: try: 760: fh=ECHO_helpers.urlopen(self.metalink) 761: dom=xml.dom.minidom.parse(fh) 762: texttools=dom.getElementsByTagName('texttool') 763: text=texttools[0].getElementsByTagName('image') 764: imagetemp=getText(text[0].childNodes) 765: 766: text=dom.getElementsByTagName('archive-path') 767: archivepath=getText(text[0].childNodes) 768: archivepath=re.sub('/mpiwg/online/','',archivepath) 769: imageurl="http://echo.mpiwg-berlin.mpg.de/zogilib?fn="+archivepath+"/"+imagetemp 770: fh.close() 771: 772: if not noredirect: 773: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') 774: self.REQUEST.RESPONSE.redirect(imageurl) 775: else: 776: if not onlyPath: 777: return imageurl 778: else: 779: return archivepath+"/"+imagetemp 780: except: 781: 782: if not noredirect: 783: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') 784: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>") 785: else: 786: return "<error>no images available</error>" 787: 788: 789: def getCopyrightsHTML(self): 790: """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus""" 791: 792: if hasattr(self,'copyrightModel'): 793: obj=self.copyrightModel 794: 795: else: 796: return "ERROR" 797: ret=[] 798: 799: for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID 800: 801: 802: try: 803: if hasattr(self.copyrightTypes,copyright[2]): 804: copyrightTypeObj=getattr(self.copyrightTypes,copyright[2]) 805: link="copyrightTypes/"+copyright[2]+'/copyright.html' 806: else: 807: copyrightTypeObj=getattr(obj,copyright[2]) 808: link="copyrightModel/"+copyright[2]+'/copyright.html' 809: 810: label=copyrightTypeObj.label 811: url=getattr(copyrightTypeObj, 'url', '') 812: 813: if url!='': 814: ret.append((url,copyright[0],copyright[1],copyright[2],label)) 815: else: 816: if hasattr(copyrightTypeObj, 'copyright.html'): 817: ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label)) 818: else: 819: ret.append(('empty',copyright[0],copyright[1],copyright[2],label)) 820: except: 821: """nothing""" 822: 823: return ret 824: 825: def getInstitutionsHTML(self): 826: """gibt Liste der foerdernden Institutionen aus""" 827: 828: if hasattr(self,'support'): 829: obj=self.support 830: ret=obj.getSupporter() 831: return ret 832: else: 833: return '' 834: 835: 836: def getCredits(self): 837: """Ausgabe der credits""" 838: if self.credits: 839: return self.credits 840: else: 841: return [] 842: 843: 844: 845: def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords): 846: 847: self.id = id 848: """Festlegen der ID""" 849: 850: self.label = label 851: self.link= link 852: self.metalink=metalink 853: self.title=title 854: self.weight=weight 855: self.credits=toList(credits) 856: self.description=description 857: self.contentType=contentType 858: self.copyrightType=copyrightType 859: self.renderingType=renderingType 860: self.responsible=responsible 861: self.resourceID=resourceID 862: 863: if coords: 864: coordsnew=[ string.split(x,",") for x in coords] 865: else: 866: coordsnew=[] 867: 868: self.coords=coordsnew 869: # self.viewClassification="" 870: 871: 872: 873: def getContentType(self): 874: try: 875: return self.contentType 876: except: 877: return "" 878: 879: def getCopyrightType(self): 880: try: 881: return self.copyrightType 882: except: 883: return "" 884: 885: def getRenderingType(self): 886: try: 887: return self.renderingType 888: except: 889: return "" 890: 891: def ECHO_resource_config(self): 892: """Main configuration""" 893: 894: if not hasattr(self,'weight'): 895: self.weight="" 896: 897: pt=zptFile(self, 'zpt/ChangeECHO_resource.zpt') 898: return pt() 899: 900: 901: def ECHO_resource_config_main(self): 902: """Main configuration""" 903: if not hasattr(self,'weight'): 904: self.weight="" 905: pt=zptFile(self, 'zpt/ChangeECHO_resource_main.zpt') 906: return pt() 907: 908: def ECHO_resource_config_coords(self): 909: """Coords configuration """ 910: pt=zptFile(self, 'zpt/ChangeECHO_resource_coords.zpt') 911: return pt() 912: 913: def ECHO_resource_config_credits(self): 914: """Main configuration""" 915: pt=zptFile(self, 'zpt/ChangeECHO_resource_credits.zpt') 916: return pt() 917: 918: def ECHO_resource_config_metadata(self): 919: """Main configuration""" 920: if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')): 921: self.metaDataHash={} 922: self.contentType=self.bib_type 923: for data in self.metadata: 924: data_neu=re.sub('-','_',data) 925: self.meta 926: DataHash[data_neu]=getattr(self,data)[0:] 927: 928: 929: pt=zptFile(self, 'zpt/ChangeECHO_resource_metadata.zpt') 930: return pt() 931: 932: 933: 934: 935: def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,RESPONSE=None): 936: """Aenderung der Properties""" 937: self.resourceID=resourceID 938: self.title=title 939: self.label=label 940: self.description=description 941: 942: self.contentType=contentType 943: self.renderingType=renderingType 944: self.weight=weight 945: 946: self.link=link 947: self.metalink=metalink 948: 949: if RESPONSE is not None: 950: RESPONSE.redirect('manage_main') 951: 952: 953: def changeECHO_resource_coords(self,RESPONSE=None): 954: """Aenderung der Properties - coords""" 955: #return self.REQUEST 956: for area in self.getMapAreas(): 957: id = area.getId() 958: if self.REQUEST.has_key('del.'+id): 959: # delete this area 960: self._delObject(id) 961: # return to same menu 962: if RESPONSE is not None: 963: RESPONSE.redirect('ECHO_resource_config_coords') 964: return 965: # modify this area 966: coordstring = self.REQUEST.get('coords.'+id, '') 967: coords = string.split(coordstring, ',') 968: angle = self.REQUEST.get('angle.'+id, '0') 969: type = self.REQUEST.get('type.'+id, 'area') 970: if len(coords) == 4: 971: area.setCoordString(coordstring) 972: area.setAngle(angle) 973: area.setType(type) 974: # return to main menu 975: if RESPONSE is not None: 976: RESPONSE.redirect('manage_main') 977: 978: 979: def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None): 980: """Aenderung der Properties""" 981: self.credits=credits 982: self.responsible=responsible 983: self.copyrightType=copyrightType 984: 985: if RESPONSE is not None: 986: RESPONSE.redirect('manage_main') 987: 988: 989: def changeECHO_resource_metadata_local(self,RESPONSE=None): 990: """change metadata""" 991: tags=self.findTagsFromMapping(self.contentType) 992: for field in tags[1]: 993: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)][0:] 994: 995: 996: 997: if RESPONSE is not None: 998: RESPONSE.redirect('manage_main') 999: 1000: def changeECHO_resource_metadata(self,RESPONSE=None): 1001: """change metadata""" 1002: tags=self.findTagsFromMapping(self.contentType) 1003: self.OSAS_meta={} 1004: for field in tags[1]: 1005: try: 1006: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)] 1007: self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)] 1008: except: 1009: """nothing""" 1010: 1011: ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML')).read() 1012: 1013: 1014: if RESPONSE is not None: 1015: RESPONSE.redirect('manage_main') 1016: 1017: 1018: def getMDValue(self,fieldName,empty=None): 1019: if not empty: 1020: return self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%self.contentType) 1021: 1022: else: 1023: return self.metaDataHash.get(fieldName,empty) 1024: 1025: def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,digiliburlprefix=None): 1026: """new index.meta""" 1027: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') 1028: 1029: if not hasattr(self,'metaDataHash'): 1030: 1031: self.copyIndex_meta2echo_resource() 1032: try: 1033: return writeMetadata(self.metalink,self.OSAS_meta,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix) 1034: except: 1035: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix) 1036: 1037: def showMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None): 1038: """schreibe md""" 1039: 1040: try: 1041: 1042: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,xmlfrag="yes") 1043: except: 1044: return "<error> no metadata stored</error>" 1045: 1046: def getMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None): 1047: """prints out metadata as stored in the echo environment, format is the index.meta format""" 1048: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') 1049: return writeMetadata(self.metalink,self.metaDataHash) 1050: 1051: def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None): 1052: """Aenderung der Properties""" 1053: 1054: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight) 1055: self.link=link 1056: self.metalink=metalink 1057: 1058: if RESPONSE is not None: 1059: RESPONSE.redirect('manage_main') 1060: 1061: 1062: manage_options = Folder.manage_options+( 1063: {'label':'Main Config','action':'ECHO_resource_config_main'}, 1064: {'label':'Change Metadata','action':'ECHO_resource_config_metadata'}, 1065: {'label':'Graphic Coords','action':'ECHO_graphicEntry'}, 1066: {'label':'Sync Metadata','action':'ECHO_getResourceMD'}, 1067: {'label':'Change TemplateSets and Image Viewer','action':'changeViewerTemplateSetForm'}, 1068: {'label':'set/change startpage','action':'setStartPageForm'}, 1069: {'label':'Copy MD for indexing and search','action':'copySearchFields'}, 1070: ) 1071: 1072: 1073: def isDefinedInThisSet(self,fields,field): 1074: """checks if field is defined in fields""" 1075: if (fields[0].has_key(field)) and not (fields[0][field]==""): 1076: return 1 1077: else: 1078: 1079: return 0 1080: 1081: def getFieldLabel(self,fields,field): 1082: """get labels""" 1083: try: 1084: ret =fields[0][field] 1085: if ret == "": 1086: return field 1087: else: 1088: return ret 1089: except: 1090: return field 1091: 1092: 1093: 1094: def getFieldTag(self,fields,field): 1095: """get labels""" 1096: try: 1097: ret =fields[0][field] 1098: if ret == "": 1099: return field 1100: else: 1101: return ret 1102: except: 1103: return field 1104: 1105: 1106: 1107: def getFieldValue(self,field): 1108: """get value""" 1109: 1110: try: 1111: 1112: ret=self.metaDataHash[field] 1113: if ret == "": 1114: return None 1115: else: 1116: 1117: return ret 1118: except: 1119: return None 1120: 1121: def getMetaDataHash(self): 1122: """md hash""" 1123: return self.metaDataHash 1124: 1125: def setFieldValue(self,field,value): 1126: """get value""" 1127: 1128: if not hasattr(self,'metaDataHash'): 1129: setattr(self,'metaDataHash',{}) 1130: self.metaDataHash[field]=value[0:] 1131: 1132: 1133: def copySearchFields(self): 1134: """copys metadatafields to the object""" 1135: fields=['author','title','year'] 1136: for field in fields: 1137: setattr(self,'MD_'+field,self.getFieldValue(field)) 1138: 1139: 1140: def findLabelsFromMapping(self,referenceType): 1141: """gib hash mit label -> generic zurueck""" 1142: #return {},[] 1143: 1144: temp=self.ZopeFind(self.standardMD) 1145: 1146: if referenceType=="": 1147: referenceType="book" 1148: 1149: 1150: bibdata={} 1151: retdata={} 1152: fields=[] 1153: fieldlist=self.standardMD.fieldList 1154: 1155: tags=self.findTagsFromMapping(self.contentType) 1156: self.referencetypes=tags[2] 1157: for referenceTypeF in self.referencetypes: 1158: 1159: if referenceTypeF[1].title.lower() == referenceType.lower(): 1160: 1161: try: 1162: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields 1163: referenceType=referenceTypeF[1].title 1164: except: 1165: bibdata[referenceType]=referenceTypeF[1].fields 1166: 1167: 1168: bibdata['data']=referenceTypeF[1] 1169: fields=bibdata[referenceType] 1170: for field in fieldlist: 1171: retdata[field]=referenceTypeF[1].getValue(field)[1] 1172: 1173: return retdata,fieldlist,temp,fields 1174: 1175: def findTagsFromMapping(self,referenceType): 1176: """gib hash mit label -> generic zurueck""" 1177: 1178: 1179: if referenceType=="": 1180: referenceType="book" 1181: 1182: temp = self.ZopeFind(self.standardMD)[0:] 1183: 1184: 1185: #self.referencetypes=temp[0:] 1186: 1187: 1188: 1189: 1190: 1191: 1192: bibdata={} 1193: retdata={} 1194: fieldlist=self.standardMD.fieldList 1195: fields=[] 1196: for referenceTypeF in temp: 1197: #print referenceType 1198: 1199: if referenceTypeF[1].title.lower() == referenceType.lower(): 1200: try: 1201: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields 1202: referenceType=referenceTypeF[1].title 1203: except: 1204: bibdata[referenceType]=referenceTypeF[1].fields 1205: bibdata['data']=referenceTypeF[1] 1206: fields=bibdata[referenceType] 1207: for field in fieldlist: 1208: retdata[field]=referenceTypeF[1].getValue(field)[0] 1209: 1210: return retdata,fieldlist,temp,fields 1211: 1212: 1213: security.declarePublic('copyIndex_meta2echo_resource') # has to be change, presentlyset because of OSAS koordination 1214: def copyIndex_meta2echo_resource(self,RESPONSE=None): 1215: """copy MD von Index_meta to the echo_resource""" 1216: 1217: (metadict, error)=readMetadata(self.metalink) 1218: 1219: 1220: 1221: self.metaDataHash={} 1222: if not error=="": #Fehler beim Auslesen des Metafiles 1223: 1224: return "ERROR:",error,self.absolute_url() 1225: 1226: self.contentType=metadict['bib_type'][0:] 1227: fields=self.findTagsFromMapping(self.contentType) 1228: 1229: #fields=self.findLabelsFromMapping(self.contentType) 1230: for field in fields[1]: 1231: 1232: if self.isDefinedInThisSet(fields,field): 1233: #print urllib.unquote(metadict.get(self.getFieldTag(fields,field),'')) 1234: self.setFieldValue(self.getFieldTag(fields,field),metadict.get(self.getFieldTag(fields,field),'')) 1235: 1236: 1237: 1238: if RESPONSE: 1239: return RESPONSE.redirect('manage_main') 1240: 1241: def ECHO_getResourceMD(self,template="yes",back=None): 1242: """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource""" 1243: (metadict, error)=readMetadata(self.metalink) 1244: 1245: if back: 1246: self.REQUEST.SESSION['back']=back 1247: 1248: if not error=="": #Fehler beim Auslesen des Metafiles 1249: return "ERROR:",error 1250: 1251: if not self.contentType: 1252: self.contentType=metadict['bib_type'].lower() 1253: 1254: if not (metadict['bib_type'].lower()==self.contentType.lower()): 1255: self.REQUEST.SESSION['contentStorage']=metadict['bib_type'] 1256: self.REQUEST.SESSION['contentZope']=self.contentType 1257: 1258: return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')() 1259: 1260: self.REQUEST.SESSION['metadict']=metadict 1261: 1262: 1263: 1264: self.REQUEST.SESSION['diffs']=checkDiffs(self,self.REQUEST.SESSION['metadict']) 1265: 1266: 1267: 1268: if template=="yes": 1269: pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt') 1270: return pt() 1271: 1272: 1273: 1274: 1275: 1276: def ECHO_getMD(self,item): 1277: """Ausgabe der MD""" 1278: return getattr(self,item) 1279: 1280: def checkRDF(self,path): 1281: """check if pdf in the path""" 1282: try: 1283: for fileName in os.listdir(path): 1284: if os.path.splitext(fileName)[1]==".pdf": 1285: return os.path.join(path,fileName) 1286: return None 1287: except: 1288: return None 1289: 1290: 1291: security.declareProtected('View','index_html') 1292: def index_html(self): 1293: """standard page""" 1294: pdf=self.checkRDF(self.link) 1295: if pdf: 1296: fh=file(pdf,'r').read() 1297: self.REQUEST.RESPONSE.setHeader('Content-Type','application/pdf') 1298: self.REQUEST.RESPONSE.write(fh) 1299: self.REQUEST.RESPONSE.close() 1300: return 1301: return self.REQUEST.RESPONSE.redirect(self.link) 1302: 1303: def startpage_html(self): 1304: """prints out a startpage for a resource for use e.g. in the BVE""" 1305: 1306: # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt 1307: 1308: sp=self.ZopeFind(self,obj_ids=['startpage.html']) 1309: 1310: if sp: 1311: return sp[1]() 1312: 1313: #pruefen ob irgendwo ein template 1314: if hasattr(self,'startpage_index_template'): 1315: return self.startpage_index_template() 1316: 1317: #generisches template ausgeben 1318: 1319: pt=zptFile(self, 'zpt/ECHO_startpage_index_template_standard.zpt') 1320: pt.content_type="text/html" 1321: return pt() 1322: 1323: def toc_html(self): 1324: 1325: sp=self.ZopeFind(self,obj_ids=['toc.html']) 1326: 1327: if sp: 1328: return sp[0][1]() 1329: 1330: 1331: security.declarePublic('generate_label') # has to be change, presentlyset because of OSAS koordination 1332: 1333: def generate_label(self): 1334: """Erzeugt_standard_Label aus Template""" 1335: pt=getattr(self,"label_template_"+self.contentType.lower()) 1336: 1337: self.label=pt()[0:] 1338: return pt() 1339: 1340: security.declarePublic('generate_title') # has to be change, presentlyset because of OSAS koordination 1341: 1342: def generate_title(self,RESPONSE=None): 1343: """Erzeugt_standard_Label aus Template""" 1344: pt=getattr(self,"label_template_"+self.contentType.lower()) 1345: 1346: self.title=pt()[0:] 1347: 1348: return pt() 1349: 1350: Globals.InitializeClass(ECHO_resource) 1351: 1352: def manage_addECHO_resourceForm(self): 1353: """Form for adding a ressource""" 1354: pt=zptFile(self, 'zpt/AddECHO_resourceForm.zpt') 1355: return pt() 1356: 1357: 1358: 1359: def manage_addECHO_resource(self,id,title,label,description="",responsible="",link="",metalink="",weight="",copyrightType=None,resourceID=None,contentType=None,renderingType=None,credits=None,coords=None,RESPONSE=None): 1360: """addresource""" 1361: 1362: newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords) 1363: 1364: self._setObject(id,newObj) 1365: 1366: if RESPONSE is not None: 1367: RESPONSE.redirect('manage_main') 1368: 1369: 1370: class ECHO_externalLink(Folder,ECHO_basis): 1371: """Link zu einer externen Ressource""" 1372: security=ClassSecurityInfo() 1373: meta_type='ECHO_externalLink' 1374: 1375: security.declarePublic('content_html') 1376: def content_html(self): 1377: """template fuer content""" 1378: return ECHO_basis.content_html(self,'externalLink') 1379: 1380: def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords): 1381: 1382: self.id = id 1383: """Festlegen der ID""" 1384: 1385: self.credits=toList(credits) 1386: self.label = label 1387: self.link= link 1388: self.title=title 1389: self.weight=weight 1390: self.description=description 1391: self.contentType=contentType 1392: self.responsible=responsible 1393: coordsnew=[ string.split(x,",") for x in coords] 1394: self.coords=coordsnew 1395: 1396: def ECHO_externalLink_config(self): 1397: """Main configuration""" 1398: 1399: if not hasattr(self,'weight'): 1400: self.weight="" 1401: if not hasattr(self,'coords'): 1402: 1403: self.coords=[''] 1404: 1405: 1406: pt=zptFile(self, 'zpt/ChangeECHO_externalLink.zpt') 1407: return pt() 1408: 1409: 1410: def changeECHO_externalLink(self,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None): 1411: """Aenderung der Properties""" 1412: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight) 1413: 1414: self.link=link 1415: if RESPONSE is not None: 1416: RESPONSE.redirect('manage_main') 1417: 1418: 1419: manage_options = Folder.manage_options+( 1420: {'label':'Main Config','action':'ECHO_externalLink_config'}, 1421: {'label':'Graphic Coords','action':'ECHO_graphicEntry'}, 1422: ) 1423: 1424: 1425: def index_html(self): 1426: """standard page""" 1427: 1428: return self.REQUEST.RESPONSE.redirect(self.link) 1429: 1430: def manage_addECHO_externalLinkForm(self): 1431: """Form for external Links""" 1432: pt=zptFile(self, 'zpt/AddECHO_externalLinkForm.zpt') 1433: return pt() 1434: 1435: 1436: def manage_addECHO_externalLink(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None): 1437: """Add an external Link""" 1438: 1439: newObj=ECHO_externalLink(id,link,title,label,description,contentType,responsible,credits,weight,coords) 1440: 1441: self._setObject(id,newObj) 1442: 1443: if RESPONSE is not None: 1444: RESPONSE.redirect('manage_main') 1445: 1446: 1447: class ECHO_link(ECHO_externalLink): 1448: """external_link""" 1449: 1450: meta_type="ECHO_link" 1451: 1452: 1453: def content_html(self): 1454: """template fuer link""" 1455: if hasattr(self,"link_template"): 1456: return ECHO_basis.content_html(self,'link') 1457: else: 1458: return ECHO_basis.content_html(self,'collection') 1459: 1460: def index_html(self): 1461: """standard link""" 1462: if self.link: 1463: splitted=self.link.split("?") 1464: if len(splitted)>1: 1465: params=cgi.parse_qs(splitted[1]) 1466: 1467: for x in params.keys(): 1468: if type(params[x]) is ListType: 1469: params[x]=params[x][0] 1470: 1471: 1472: else: 1473: params={} 1474: 1475: params['backLink']=self.aq_parent.absolute_url() 1476: params['startLink']=splitted[0]+"?"+urllib.urlencode(params) 1477: 1478: 1479: return self.REQUEST.RESPONSE.redirect(splitted[0]+"?"+urllib.urlencode(params)) 1480: else: 1481: return "" 1482: 1483: def manage_addECHO_linkForm(self): 1484: """Form for external Links""" 1485: pt=zptFile(self, 'zpt/AddECHO_linkForm.zpt') 1486: return pt() 1487: 1488: 1489: def manage_addECHO_link(self,id,title,label,description="",contentType="",responsible="",link="",weight="",coords=[],credits=None,RESPONSE=None): 1490: """Add an external Link""" 1491: 1492: newObj=ECHO_link(id,link,title,label,description,contentType,responsible,credits,weight,coords) 1493: 1494: self._setObject(id,newObj) 1495: 1496: if RESPONSE is not None: 1497: RESPONSE.redirect('manage_main') 1498: 1499: 1500: class ECHO_collection(Folder, Persistent, Implicit, Cacheable,ECHO_basis): 1501: """ECHO Collection""" 1502: 1503: security=ClassSecurityInfo() 1504: meta_type='ECHO_collection' 1505: # viewClassificationList=viewClassificationListMaster 1506: displayTypes=displayTypes 1507: 1508: path="/mpiwg/online/permanent/shipbuilding" 1509: 1510: def localizeObjects(self): 1511: """localize all objects""" 1512: contents=self.ZopeFind(self,obj_metatypes=['ECHO_link','ECHO_mapText']) 1513: find=self.ZopeFind(self,obj_ids=('locale_en')) 1514: if not find: 1515: self.manage_addECHO_locale("en",'','') 1516: for content in contents: 1517: if content[1].meta_type=='ECHO_link': 1518: find=content[1].ZopeFind(content[1],obj_metatypes=('ECHO_mapText')) 1519: if find: 1520: root=find[0][1] 1521: 1522: locale=find[0][1].ZopeFind(find[0][1],obj_ids=('locale_en')) 1523: else: 1524: root=None 1525: else: 1526: root=content[1] 1527: locale=content[1].ZopeFind(content[1],obj_ids=('locale_en')) 1528: if root and not locale: 1529: root.manage_addECHO_locale("en",'','') 1530: 1531: pt=zptFile(self, 'zpt/localizeObjects.zpt') 1532: return pt() 1533: 1534: 1535: def localize(self,REQUEST,RESPONSE): 1536: """localize""" 1537: for key in REQUEST.form.keys(): 1538: splitted=key.split("!") 1539: 1540: if splitted[0]=="" or splitted[0]=="en" or splitted[0]=="title" or splitted[0]=="label": 1541: if splitted[0]=="en": 1542: setattr(self.locale_en,splitted[1],REQUEST.form[key]) 1543: else: 1544: setattr(self,splitted[0],REQUEST.form[key]) 1545: else: 1546: obj=getattr(self,splitted[0]) 1547: 1548: if obj.meta_type=="ECHO_mapText": 1549: if splitted[1]=="en": 1550: obj.locale_en.pt_edit(REQUEST.form[key],None) 1551: else: 1552: obj.pt_edit(REQUEST.form[key],None) 1553: else: 1554: text=obj.ZopeFind(obj,obj_metatypes=['ECHO_mapText']) 1555: if splitted[1]=="en": 1556: 1557: text[0][1].locale_en.pt_edit(REQUEST.form[key],None) 1558: else: 1559: text[0][1].pt_edit(REQUEST.form[key],None) 1560: if RESPONSE is not None: 1561: RESPONSE.redirect('manage_main') 1562: 1563: 1564: def getRDF(self,urn=None): 1565: """rdf of the collection""" 1566: 1567: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection']) 1568: 1569: ret=getRDFDescription(self,self.absolute_url(),urn=urn) 1570: 1571: if not urn: 1572: urn=self.absolute_url() 1573: 1574: li="""<RDF:li RDF:resource="%s" />\n""" 1575: 1576: 1577: for content in contents: 1578: ret+=content[1].getRDF()+"\n" 1579: 1580: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn 1581: for content in contents: 1582: nurn=content[1].absolute_url() 1583: ret+=li%nurn 1584: return ret+"</RDF:Seq>" 1585: 1586: 1587: 1588: def changeLabels(self): 1589: """change form""" 1590: pt=zptFile(self, 'zpt/changeLabelsForm') 1591: pt.content_type="text/html" 1592: return pt() 1593: 1594: def changeTitles(self): 1595: """change form""" 1596: pt=zptFile(self, 'zpt/changeTitleForm') 1597: pt.content_type="text/html" 1598: return pt() 1599: 1600: def changeWeights(self): 1601: """change form""" 1602: pt=zptFile(self, 'zpt/changeWeightForm') 1603: pt.content_type="text/html" 1604: return pt() 1605: 1606: def changeMetaDataLinks(self): 1607: """change form""" 1608: pt=zptFile(self, 'zpt/changeMetaDataLinkForm') 1609: pt.content_type="text/html" 1610: return pt() 1611: def changeAccessRightsCollection(self): 1612: """change""" 1613: ret="" 1614: argv=self.REQUEST.form 1615: 1616: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) 1617: for resource in resources: 1618: 1619: try: 1620: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>" 1621: resource[1].changeAccessRightMD(argv[resource[1].getId()]) 1622: except: 1623: pass 1624: return ret 1625: 1626: def changeMetaDataLinkInCollection(self): 1627: """change all lables of a collection""" 1628: ret="" 1629: argv=self.REQUEST.form 1630: 1631: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) 1632: for resource in resources: 1633: 1634: try: 1635: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>" 1636: resource[1].metalink=argv[resource[1].getId()][0:] 1637: except: 1638: pass 1639: return ret 1640: 1641: def changeMetaDataLinkInCollection(self): 1642: """change all lables of a collection""" 1643: ret="" 1644: argv=self.REQUEST.form 1645: 1646: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) 1647: for resource in resources: 1648: 1649: try: 1650: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>" 1651: resource[1].metalink=argv[resource[1].getId()][0:] 1652: except: 1653: pass 1654: return ret 1655: 1656: def changeWeightsInCollection(self): 1657: """change all lables of a collection""" 1658: ret="" 1659: argv=self.REQUEST.form 1660: 1661: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) 1662: for resource in resources: 1663: 1664: try: 1665: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>" 1666: resource[1].weight=argv[resource[1].getId()][0:] 1667: except: 1668: pass 1669: return ret 1670: 1671: def changeTitlesInCollection(self): 1672: """change all lables of a collection""" 1673: ret="" 1674: argv=self.REQUEST.form 1675: 1676: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) 1677: for resource in resources: 1678: 1679: try: 1680: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>" 1681: resource[1].title=argv[resource[1].getId()][0:] 1682: except: 1683: pass 1684: return ret 1685: 1686: def changeLabelsInCollection(self): 1687: """change all lables of a collection""" 1688: ret="" 1689: argv=self.REQUEST.form 1690: 1691: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) 1692: for resource in resources: 1693: 1694: try: 1695: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>" 1696: resource[1].label=argv[resource[1].getId()][0:] 1697: except: 1698: pass 1699: return ret 1700: 1701: def updateCollection(self,RESPONSE=None): 1702: """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner""" 1703: files=os.listdir(self.path) 1704: ret="" 1705: for fileName in files: 1706: 1707: if fileName: 1708: 1709: tempPath=re.sub("/mpiwg/online","",self.path) 1710: link="http://echo.mpiwg-berlin.mpg.de/zogilib_book?fn="+tempPath+"/"+fileName+"/pageimg" 1711: 1712: metalink=self.path+"/"+fileName+"/index.meta" 1713: try: 1714: 1715: #link="http://nausikaa2.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.x.cgi?dir="+fileName+"&step=thumb" 1716: 1717: newObj=ECHO_resource(fileName,link,metalink,fileName,fileName,fileName,'generated','book','','','','','','') 1718: self._setObject(fileName,newObj) 1719: 1720: genObj=getattr(self,fileName) 1721: #genObj.createIndexFile() 1722: ret+="OK:"+fileName+"<br/>" 1723: except: 1724: print "ERROR" 1725: ret+="ERROR:"+fileName+"<br/>" 1726: 1727: return ret 1728: 1729: if RESPONSE is not None: 1730: RESPONSE.redirect('manage_main') 1731: 1732: def updateCollectionMD(self,RESPONSE=None): 1733: """updateMD""" 1734: files=os.listdir(self.path) 1735: for fileName in files: 1736: if fileName: 1737: genObj=getattr(self,fileName) 1738: genObj.copyIndex_meta2echo_resource() 1739: genObj.generate_title() 1740: 1741: if RESPONSE is not None: 1742: RESPONSE.redirect('manage_main') 1743: 1744: 1745: 1746: def changeViewerTemplateSetsForm(self): 1747: """change the viewer template set""" 1748: pt=zptFile(self, 'zpt/changeViewerTemplateSet') 1749: return pt() 1750: 1751: def getViewerTemplateSets(self,obj_ids=None,RESPONSE=None): 1752: """Get the ViewerTemplateSet title for configuration""" 1753: ret=[] 1754: 1755: try: 1756: viewerTemplateSets=self.ZopeFind(self.viewerTemplateSets,obj_metatypes=['OSAS_viewerTemplateSet'],obj_ids=obj_ids)#assumes viewerTemplateSets folder somewhere in the hierarchie. 1757: 1758: for viewerTemplateSet in viewerTemplateSets: 1759: ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1])) 1760: 1761: return ret 1762: 1763: except: 1764: return [('no ViewerTemplateSetfolders','')] 1765: 1766: def getTextToolsField(self,name,default=''): 1767: """Lese viewerTemplateSet der Collection not implemented yet!""" 1768: 1769: return default 1770: 1771: 1772: def isSelectedViewerTemplateSet(self,obj,id): 1773: """is ausgewaehlt""" 1774: 1775: if self.REQUEST['viewerTemplateSet']==id: 1776: return 1 1777: else: 1778: return None 1779: 1780: def changeViewerTemplateSets(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None): 1781: """change the templates""" 1782: 1783: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) 1784: 1785: for resource in resources: 1786: 1787: resource[1].changeViewerTemplateSet(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix) 1788: 1789: if RESPONSE is not None: 1790: RESPONSE.redirect('manage_main') 1791: 1792: 1793: def setStartpageFolderForm(self): 1794: """Form for changing the startpage""" 1795: 1796: 1797: pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPageFolder.zpt') 1798: pt.content_type="text/html" 1799: return pt() 1800: 1801: def setStartpageFolder(self,startpage=None,RESPONSE=None): 1802: """change the templates""" 1803: 1804: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) 1805: 1806: for resource in resources: 1807: 1808: resource[1].setStartPage(startpage) 1809: 1810: if RESPONSE is not None: 1811: RESPONSE.redirect('manage_main') 1812: 1813: def copyTitleToInfoXMLFolder(self,RESPONSE=None): 1814: """copy title into the title field of info.xml 1815: author and date werden leer!!! 1816: """ 1817: 1818: 1819: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) 1820: 1821: 1822: for resource in resources: 1823: ret,txt=resource[1].copyTitleToInfoXML() 1824: if (not ret) and RESPONSE: 1825: RESPONSE.write("error: %s\n"%txt) 1826: if ret and RESPONSE: 1827: RESPONSE.write("ok: %s\n"%txt) 1828: 1829: #zLOG.LOG("ECHO (copyTitleToInfoXMLFolder)",zLOG.INFO,txt) 1830: if RESPONSE is not None: 1831: RESPONSE.write("done!\n") 1832: RESPONSE.close() 1833: RESPONSE.redirect('manage_main') 1834: 1835: def copySearchFields(self,RESPONSE=None): 1836: """copys import metadatafields to the object""" 1837: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) 1838: 1839: for resource in resources: 1840: 1841: resource[1].copySearchFields() 1842: 1843: if RESPONSE is not None: 1844: RESPONSE.redirect('manage_main') 1845: 1846: def reloadMetaDataFromStorageWarning(self,RESPONSE=None): 1847: """warning""" 1848: pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt') 1849: pt.content_type="text/html" 1850: return pt() 1851: 1852: def reloadMetaDataFromStorage(self,RESPONSE=None): 1853: """copy metadata from the storage to ECHO""" 1854: 1855: return reloadMetaDataFromStorage(self,RESPONSE=None) 1856: 1857: 1858: def getPartnerCopyright(self,name,sonst="generic"): 1859: """gibt generisches copyright eines partners aus, sonst behalte jetzige einsteillung""" 1860: #print "hi",name,sonst 1861: #print getattr(self.partners,name).copyrightType 1862: try: 1863: partner=getattr(self.partners,name) 1864: return partner.copyrightType 1865: except: 1866: print "error" 1867: return sonst 1868: 1869: def partnerSelector_HTML(self,selected=None): 1870: """give type selector""" 1871: if not selected: 1872: retStr="<option selected>\n" 1873: else: 1874: retStr="<option>\n" 1875: 1876: try: # erste version copyrightTypes exists 1877: for partner in self.credits: 1878: if selected and (partner==selected): 1879: retStr+="""<option selected value="%s">%s\n"""%(partner,partner) 1880: else: 1881: retStr+="""<option value="%s">%s\n"""%(partner,partner) 1882: except: 1883: """nothing""" 1884: return retStr 1885: 1886: # def getViewClassification(self): 1887: # if hasattr(self,'viewClassification'): 1888: # return self.viewClassification 1889: # else: 1890: # return "" 1891: 1892: 1893: def createRessourcesFromXMLForm(self): 1894: """form""" 1895: pt=zptFile(self, 'zpt/createRessourcesFromXMLForm.zpt') 1896: return pt() 1897: 1898: def createRessourcesFromXML(self,fileupload): 1899: """read an XML file for generating resources""" 1900: dom=xml.dom.minidom.parse(fileupload) 1901: ret="<h2>Added</h2>" 1902: for resource in dom.getElementsByTagName('resource'): 1903: link=getText(resource.getElementsByTagName('link')[0].childNodes) 1904: label=getText(resource.getElementsByTagName('label')[0].childNodes) 1905: #splitted=link.split("?")[0].split("/") 1906: #id=splitted[len(splitted)-1].encode('ascii') 1907: id=re.sub(" ","_",label).encode('ascii') 1908: 1909: ret+="<p>"+label+"</p>" 1910: manage_addECHO_resource(self,id,label.encode('ascii'),label.encode('ascii'),"","","",link.encode('ascii'),"","") 1911: return ret 1912: 1913: security.declarePublic('getImageTag') 1914: def getImageTag(self): 1915: """GetTag""" 1916: try: 1917: return self.imageTag 1918: except: 1919: return "" 1920: 1921: 1922: def addMovie(self,id,title,label,description,contentType,responsible,link,thumbUrl,rawFile,lowresFile,metalink,weight,credits=None,coords=None,RESPONSE=None): 1923: """SSS""" 1924: 1925: #manage_addECHO_movie(self,id,title,label,description,responsible,link,thumbUrl,rawFile,metalink,weight,credits=None,coords=None,RESPONSE=None) 1926: if not hasattr(self,id): 1927: try: 1928: manage_addECHO_movie(self,id,title,label,description,responsible,link,thumbUrl,rawFile,lowresFile,metalink,weight,credits=None,coords=None,RESPONSE=None) 1929: return "done" 1930: except: 1931: return None 1932: else: 1933: obj=getattr(self,id) 1934: obj.changeECHO_movie_main(metalink,link,rawFile,lowresFile,thumbUrl,title,label,description,contentType,weight=weight) 1935: 1936: return "changed" 1937: 1938: def addResource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None): 1939: """SSS""" 1940: try: 1941: manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None) 1942: return "done" 1943: except: 1944: return None 1945: 1946: def getSecondaryLink(self): 1947: """secondary link""" 1948: try: 1949: return self.secondaryLink 1950: except: 1951: return "" 1952: 1953: def getSecondaryLinkTitle(self): 1954: """secondary link""" 1955: try: 1956: return self.secondaryLinkTitle 1957: except: 1958: return "" 1959: 1960: def getCollectionTreeXML(self,pwstr=None): 1961: """Tree as XML""" 1962: 1963: def addPassWd(str,pwstr=None): 1964: """adds a user/passwd to an url""" 1965: if pwstr: 1966: txt2=re.sub(r"(http://)(.*?)","\g<1>%s@\g<2>"%pwstr,str) 1967: else: 1968: txt2=re.sub(r"(http://)(.*?)","\g<1>www:3333@\g<2>",str) 1969: return txt2 1970: 1971: def getCollection(object,depth=0,pwstr=None): 1972: depth+=1 1973: collections="" 1974: for entry in object.__dict__.keys(): 1975: element=getattr(object,entry) 1976: try: 1977: if element.meta_type in ["ECHO_collection","ECHO_group"]: 1978: collections+="<element name=\""+urllib.quote(element.title)+"\" url=\""+addPassWd(element.absolute_url(),pwstr=pwstr)+"\">" 1979: collections+=getCollection(element,depth)+"</element>\n" 1980: except: 1981: """nothing""" 1982: return collections 1983: 1984: ret="""<?xml version="1.0" encoding="utf-8" ?>""" 1985: return ret+"<collection>"+getCollection(self,pwstr=pwstr)+"</collection>" 1986: 1987: def createAllJSAreas(self): 1988: """create area calls for JavaScript""" 1989: areas = self.getAllMapAreas() 1990: return self.createJSAreas(areas) 1991: 1992: security.declarePublic('getCreditObject') 1993: def getCreditObject(self,name): 1994: """credit id to credititem""" 1995: try: 1996: return getattr(self.partners,name) 1997: except: 1998: return "" 1999: 2000: security.declarePublic('ECHO_generateNavBar') 2001: def ECHO_generateNavBar(self): 2002: """Erzeuge Navigationsbar""" 2003: link="" 2004: object="self" 2005: ret=[] 2006: path=self.getPhysicalPath() 2007: for element in path: 2008: 2009: 2010: if not element=="": 2011: object+="."+element 2012: 2013: label=eval(object).label 2014: link+="/"+element 2015: if not label=="": 2016: ret.append((label,link)) 2017: return ret 2018: 2019: 2020: def ECHO_rerenderLinksMDWarning(self): 2021: """change form""" 2022: pt=zptFile(self, 'zpt/rerenderLinksWarning') 2023: pt.content_type="text/html" 2024: return pt() 2025: 2026: 2027: 2028: security.declarePublic('ECHO_rerenderLinksMD') 2029: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']): 2030: """Rerender all Links""" 2031: return ECHO_rerenderLinksMD(self,obj,types) 2032: 2033: 2034: def __init__(self,id,title,label,description="",contentType="",responsible="",credits="",weight="",sortfield="",coords=[],secondaryLinkTitle="",secondaryLink="",imageTag="",bgcolour=""): 2035: 2036: self.id = id 2037: """Festlegen der ID""" 2038: self.credits=toList(credits) 2039: self.label = label 2040: self.title=title 2041: self.description=description 2042: self.contentType=contentType 2043: self.responsible=responsible 2044: self.imageTag=imageTag 2045: self.weight=weight 2046: self.sortfield=sortfield 2047: coordsnew=[ string.split(x,",") for x in coords] 2048: self.coords=coordsnew 2049: self.secondaryLinkTitle=secondaryLinkTitle 2050: self.secondaryLink=secondaryLink 2051: self.bgcolour=bgcolour 2052: 2053: 2054: manage_options = Folder.manage_options+ Cacheable.manage_options+( 2055: {'label':'Main Config','action':'ECHO_collection_config'}, 2056: {'label':'Change Labels','action':'changeLabels'}, 2057: {'label':'Change Titles','action':'changeTitles'}, 2058: {'label':'Localize','action':'localizeObjects'}, 2059: {'label':'Change Weights','action':'changeWeights'}, 2060: {'label':'Rerender Labels and Titles','action':'ECHO_rerenderLinksMDWarning'}, 2061: {'label':'Graphic Coords','action':'ECHO_graphicEntry'}, 2062: {'label':'create resources from XML','action':'createRessourcesFromXMLForm'}, 2063: {'label':'Set Startpage','action':'setStartpageFolderForm'}, 2064: {'label':'Change Viewer Templates and Image Viewer','action':'changeViewerTemplateSetsForm'}, 2065: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'}, 2066: {'label':'ImportCollection','action':'updateCollection'}, 2067: {'label':'Copy MD for indexing and search','action':'copySearchFields'}, 2068: ) 2069: 2070: 2071: security.declarePublic('ECHO_collection_config') 2072: def ECHO_collection_config(self): 2073: """Main configuration""" 2074: 2075: if not hasattr(self,'weight'): 2076: self.weight="" 2077: 2078: if not hasattr(self,'sortfield'): 2079: self.sortfield="weight" 2080: 2081: pt=zptFile(self, 'zpt/ChangeECHO_collection.zpt') 2082: return pt() 2083: 2084: 2085: def getBgcolour(self): 2086: """colour""" 2087: if hasattr(self,'bgcolour') and not (self.bgcolour==""): 2088: return self.bgcolour 2089: else: 2090: return "#dddddd" 2091: 2092: 2093: security.declarePublic('changeECHO_collection') 2094: def changeECHO_collection(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",location=None,isAlwaysClickable=None,prefix="",suffix=""): 2095: """Aenderung der Properties""" 2096: 2097: self.secondaryLink=secondaryLink 2098: self.secondaryLinkTitle=secondaryLinkTitle 2099: self.imageTag=imageTag 2100: self.bgcolour=bgcolour 2101: self.location=location 2102: self.isAlwaysClickable=isAlwaysClickable 2103: self.prefix=prefix[0:] 2104: self.suffix=suffix[0:] 2105: 2106: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight) 2107: 2108: self.sortfield=sortfield 2109: 2110: if RESPONSE is not None: 2111: RESPONSE.redirect('manage_main') 2112: 2113: def setAlwaysClickable(self,flag="yes"): 2114: """set clickable""" 2115: if flag=="yes": 2116: self.isAlwaysClickable="yes" 2117: else: 2118: self.isAlwaysClickable=None 2119: 2120: return flag 2121: 2122: def showOverview(self): 2123: """overview""" 2124: if 'ECHO_overview.html' in self.__dict__.keys(): 2125: return getattr(self,'ECHO_overview.html')() 2126: pt=zptFile(self, 'zpt/ECHO_content_overview.zpt') 2127: return pt() 2128: 2129: 2130: security.declareProtected('View','index_html') 2131: def index_html(self): 2132: """standard page""" 2133: if self.ZCacheable_isCachingEnabled(): 2134: 2135: result = self.ZCacheable_get() 2136: if result is not None: 2137: # Got a cached value. 2138: return result 2139: 2140: if 'index.html' in self.__dict__.keys(): 2141: ret=getattr(self,'index.html')() 2142: 2143: elif 'overview' in self.__dict__.keys(): 2144: ret=self.showOverview() 2145: elif hasattr(self,'collection_index_template'): 2146: ret=self.collection_index_template() 2147: elif hasattr(self,'main_index_template'): 2148: 2149: ret=self.main_index_template.__of__(self)(self.main_template) 2150: else: 2151: pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt') 2152: pt.content_type="text/html" 2153: ret=pt.render() 2154: 2155: self.ZCacheable_set(ret) 2156: return ret 2157: 2158: security.declarePublic('content_html') 2159: def content_html(self,**argv): 2160: """template fuer content""" 2161: #print "NN",argv 2162: return ECHO_basis.content_html(self,'collection') 2163: 2164: def getCredits(self): 2165: """Ausgabe der credits""" 2166: if self.credits: 2167: return self.credits 2168: else: 2169: return [] 2170: 2171: def area_img(self): 2172: """area image""" 2173: bt = BrowserCheck(self) 2174: if bt.isIE or bt.isN4: 2175: return sendFile(self, 'images/red.gif', 'image/gif') 2176: else: 2177: return sendFile(self, 'images/reda.png', 'image/png') 2178: 2179: def trans_img(self): 2180: """empty image""" 2181: return sendFile(self, 'images/trans.gif', 'image/gif') 2182: 2183: def hl_lib_js(self): 2184: """javascript""" 2185: return sendFile(self, 'js/hl_lib.js', 'text/plain') 2186: 2187: def js_lib_js(self): 2188: """javascript -- old name""" 2189: return sendFile(self, 'js/baselib.js', 'text/plain') 2190: 2191: def baselib_js(self): 2192: """javascript""" 2193: return sendFile(self, 'js/baselib.js', 'text/plain') 2194: 2195: def hl_add_js(self): 2196: """javascript""" 2197: return sendFile(self, 'js/hl_add.js', 'text/plain') 2198: 2199: def getAllMapAreas(self,mapColTypes=['ECHO_collection','ECHO_resource','ECHO_link','ECHO_externalLink']): 2200: """Give list of coordinates""" 2201: 2202: areas=[] 2203: for entry in self.getSubCols(subColTypes=mapColTypes): 2204: object=entry 2205: areas.extend(object.getMapAreas()) 2206: return areas 2207: 2208: 2209: def deleteMapAreas(self): 2210: """deletes all map areas from this object""" 2211: for obs in self.ZopeFind(self, obj_metatypes=['MapArea'], search_sub=1): 2212: ob = obs[1] 2213: id = ob.id 2214: parent = ob.aq_parent 2215: print "deleting: ", ob.id 2216: parent._delObject(id) 2217: return "Done" 2218: 2219: 2220: getSubCols = ECHO_helpers.getSubCols 2221: 2222: Globals.InitializeClass(ECHO_collection) 2223: 2224: def manage_addECHO_collectionForm(self): 2225: """Add collection form""" 2226: pt=zptFile(self, 'zpt/AddECHO_collectionForm.zpt') 2227: return pt() 2228: 2229: 2230: def manage_addECHO_collection(self,id,title,label,description="",contentType="",responsible="",weight=0,sortfield="weight",coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour=""): 2231: """add a echo collection""" 2232: 2233: 2234: newObj=ECHO_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="") 2235: 2236: self._setObject(id,newObj) 2237: 2238: if RESPONSE is not None: 2239: RESPONSE.redirect('manage_main') 2240: 2241: class ECHO_group(ECHO_collection): 2242: """ECHO Gruppe""" 2243: security=ClassSecurityInfo() 2244: meta_type="ECHO_group" 2245: 2246: manage_options = Folder.manage_options+( 2247: {'label':'Main Config','action':'ECHO_group_config'}, 2248: {'label':'Rerender Links','action':'ECHO_rerenderLinksMDWarning'}, 2249: {'label':'Graphic Coords','action':'ECHO_graphicEntry'}, 2250: ) 2251: 2252: security.declareProtected('View','index_html') 2253: 2254: 2255: def getRDF(self,urn=None): 2256: """rdf of the collection""" 2257: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection']) 2258: 2259: ret=getRDFDescription(self,self.absolute_url(),urn=urn) 2260: 2261: 2262: if not urn: 2263: urn=self.absolute_url() 2264: li="""<RDF:li RDF:resource="%s" />\n""" 2265: 2266: 2267: for content in contents: 2268: ret+=content[1].getRDF()+"\n" 2269: 2270: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn 2271: for content in contents: 2272: nurn=content[1].absolute_url() 2273: ret+=li%nurn 2274: return ret+"</RDF:Seq>" 2275: 2276: def index_html(self): 2277: """standard page""" 2278: displayedObjects=self.ZopeFind(self,obj_metatypes=displayTypes) 2279: #if (len(displayedObjects)==1) and (displayedObjects[0][1].meta_type=="ECHO_collection"): # nur ein Object dann redirect auf dieses Object 2280: # return self.REQUEST.RESPONSE.redirect(displayedObjects[0][1].absolute_url()) 2281: 2282: if 'index.html' in self.__dict__.keys(): 2283: return getattr(self,'index.html')() 2284: 2285: elif 'overview' in self.__dict__.keys(): 2286: return self.showOverview() 2287: elif hasattr(self,'group_index_template'): 2288: return self.group_index_template() 2289: elif hasattr(self,'collection_index_template'): 2290: return self.collection_index_template() 2291: elif hasattr(self,'main_index_template'): 2292: return self.main_index_template() 2293: 2294: pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt') 2295: pt.content_type="text/html" 2296: return pt() 2297: 2298: def ECHO_group_config(self): 2299: """Main configuration""" 2300: 2301: if not hasattr(self,'weight'): 2302: self.weight="" 2303: 2304: if not hasattr(self,'sortfield'): 2305: self.sortfield="weight" 2306: 2307: if not hasattr(self,'coords'): 2308: self.coords=[] 2309: 2310: pt=zptFile(self, 'zpt/ChangeECHO_group.zpt') 2311: return pt() 2312: 2313: def changeECHO_group(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",logo=""): 2314: """Aenderung der Properties""" 2315: 2316: self.secondaryLink=secondaryLink 2317: self.secondaryLinkTitle=secondaryLinkTitle 2318: self.imageTag=imageTag 2319: self.bgcolour=bgcolour 2320: self.logo=logo 2321: 2322: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight) 2323: 2324: 2325: 2326: self.sortfield=sortfield 2327: 2328: if RESPONSE is not None: 2329: RESPONSE.redirect('manage_main') 2330: 2331: def getLogo(self): 2332: """logo ausgeben""" 2333: try: 2334: return self.logo 2335: except: 2336: return "ECHO_groups" 2337: 2338: security.declarePublic('content_html') 2339: def content_html(self): 2340: """template fuer content""" 2341: return ECHO_basis.content_html(self,'group') 2342: 2343: 2344: 2345: def manage_addECHO_groupForm(self): 2346: """Add group form""" 2347: pt=zptFile(self, 'zpt/AddECHO_groupForm.zpt') 2348: return pt() 2349: 2350: 2351: def manage_addECHO_group(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour="",logo=""): 2352: """add a echo group""" 2353: 2354: 2355: newObj=ECHO_group(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="") 2356: 2357: setattr(newObj,'logo',logo) 2358: self._setObject(id,newObj) 2359: 2360: if RESPONSE is not None: 2361: RESPONSE.redirect('manage_main') 2362: 2363: Globals.InitializeClass(ECHO_group) 2364: 2365: 2366: class ECHO_userFolder(UserFolder): 2367: """User folder for Intranet""" 2368: _domain_auth_mode=1 # Identification via domain 2369: meta_type="ECHO_userFolder" 2370: 2371: def authenticate(self, name, password, request): 2372: emergency = self._emergency_user 2373: if name is None: 2374: return None 2375: if emergency and name==emergency.getUserName(): 2376: user = emergency 2377: else: 2378: user = self.getUser(name) 2379: if user is not None and user.authenticate(password, request): 2380: return user 2381: else: 2382: return None 2383: 2384: def domainSpecMatch(self,spec, request): 2385: host='' 2386: addr='' 2387: 2388: # Fast exit for the match-all case 2389: if len(spec) == 1 and spec[0] == '*': 2390: return 1 2391: 2392: if request.has_key('REMOTE_HOST'): 2393: host=request['REMOTE_HOST'] 2394: 2395: if request.has_key('REMOTE_ADDR'): 2396: addr=request['REMOTE_ADDR'] 2397: 2398: if request.has_key('HTTP_X_FORWARDED_FOR'): 2399: addr=request['HTTP_X_FORWARDED_FOR'] 2400: 2401: 2402: if not host and not addr: 2403: return 0 2404: 2405: if not host: 2406: try: host=socket.gethostbyaddr(addr)[0] 2407: except: pass 2408: if not addr: 2409: try: addr=socket.gethostbyname(host) 2410: except: pass 2411: 2412: 2413: _host=host.split('.') 2414: _addr=addr.split('.') 2415: _hlen=len(_host) 2416: _alen=len(_addr) 2417: 2418: for ob in spec: 2419: sz=len(ob) 2420: _ob=ob.split('.') 2421: _sz=len(_ob) 2422: 2423: mo = addr_match(ob) 2424: if mo is not None: 2425: if mo.end(0)==sz: 2426: fail=0 2427: for i in range(_sz): 2428: a=_addr[i] 2429: o=_ob[i] 2430: if (o != a) and (o != '*'): 2431: fail=1 2432: break 2433: if fail: 2434: continue 2435: return 1 2436: 2437: mo = host_match(ob) 2438: if mo is not None: 2439: if mo.end(0)==sz: 2440: if _hlen < _sz: 2441: continue 2442: elif _hlen > _sz: 2443: _item=_host[-_sz:] 2444: else: 2445: _item=_host 2446: fail=0 2447: for i in range(_sz): 2448: h=_item[i] 2449: o=_ob[i] 2450: if (o != h) and (o != '*'): 2451: fail=1 2452: break 2453: if fail: 2454: continue 2455: return 1 2456: return 0 2457: 2458: Globals.default__class_init__(ECHO_userFolder) 2459: 2460: 2461: 2462: def manage_addECHO_userFolder(self,dtself=None,REQUEST=None,**ignored): 2463: """add a user folder """ 2464: f=ECHO_userFolder() 2465: self=self.this() 2466: try: self._setObject('acl_users', f) 2467: except: return MessageDialog( 2468: title ='Item Exists', 2469: message='This object already contains a User Folder', 2470: action ='%s/manage_main' % REQUEST['URL1']) 2471: self.__allow_groups__=f 2472: if REQUEST is not None: 2473: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main') 2474: 2475: def manage_addECHO_userFolderForm(self): 2476: """add a user folder form""" 2477: return manage_addECHO_userFolder(self) 2478: 2479: 2480: 2481: def createNode(self,descrs,node): 2482: name=descrs[node]['name'] 2483: type=descrs[node]['type'] 2484: urn=node 2485: #print " will create",node.encode('utf-8') 2486: id=re.sub('[^a-zA-Z0-9]','',name).encode('ascii','ignore') 2487: #print "id",id 2488: #print type 2489: #self.REQUEST.RESPONSE.write("<p>%s<p>\n"%id) 2490: if type=="CDLI_group": 2491: 2492: try: 2493: manage_addECHO_collection(self,id,name,name,"","","","","") 2494: 2495: except: 2496: self.REQUEST.RESPONSE.write("<p>Error%s</p>\n"%id) 2497: 2498: self.REQUEST.RESPONSE.write("<p>Creates:%s</p>\n"%getattr(self,id).absolute_url()) 2499: 2500: return type,getattr(self,id),urn 2501: 2502: if type=="CDLI_item": 2503: try: 2504: manage_addECHO_resource(self,id,name,name,"","",urn,"","") 2505: except: 2506: self.REQUEST.RESPONSE.write("<p>Error%s</p>\n"%id) 2507: self.REQUEST.RESPONSE.write("<p>Creates:%s</p>\n"%getattr(self,id).absolute_url()) 2508: 2509: 2510: return "XX" 2511: 2512: 2513: class ECHO_root(Folder,Persistent,Implicit): 2514: """ECHO Root Folder""" 2515: 2516: security=ClassSecurityInfo() 2517: 2518: meta_type="ECHO_root" 2519: 2520: def printer(self,txt): 2521: print txt 2522: print txt[2] 2523: print txt[2].getImageTag() 2524: print "HO" 2525: return txt[2].getImageTag() 2526: 2527: def printer2(self,txt): 2528: print txt 2529: 2530: 2531: def item2(self,txt): 2532: return txt[2] 2533: 2534: def setLanguage(self,lang): 2535: """Set language cookie""" 2536: self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="") 2537: 2538: def switchLanguage(self): 2539: """Set language cookie""" 2540: if self.getLanguage()=="en": 2541: lang="de" 2542: else: 2543: lang="en" 2544: 2545: self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="") 2546: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']) 2547: def getLanguage(self): 2548: """get language cookie""" 2549: lang= self.REQUEST.cookies.get('lang_exhibition','de') 2550: if lang == '': 2551: lang="de" 2552: return lang 2553: 2554: def getContentOverviewTemplate(self): 2555: """produces overview template with macro""" 2556: pt = zptObjectOrFile(self, 'content_overview_template') 2557: return pt 2558: 2559: def mapstyle_css(self): 2560: """send mapstyle.css""" 2561: sendFile(self, 'html/ECHO_mapstyle.css', 'text/css') 2562: 2563: 2564: ###Cdli adds -> have to be removed 2565: def getTablet(self,item): 2566: #print "getTablet" 2567: try: 2568: read=urllib.urlopen("http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"%item).read() 2569: read=re.sub("\[search\]","search",read) 2570: return read[read.find("<body>")+6:read.rfind("</body>")] 2571: except: 2572: return "<h1>Sorry no connection to the data server enlil.museum.upenn.edu</h1>" 2573: #return "http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl" 2574: ###END CDLI add 2575: 2576: 2577: def URLquote(self, text): 2578: """urllib.quote fuer Michael""" 2579: return urllib.quote(text) 2580: 2581: 2582: def checkResource(self,id): 2583: """checks if a resource is in the tree, gives back none or list of resources""" 2584: if not id: 2585: id="" 2586: splitted=id.split("/") 2587: id=splitted[len(splitted)-1] 2588: if hasattr(self,"_v_checkResource") and self._v_checkResource.has_key(id): #existiert ein cache und id ist bereits drin? 2589: return self._v_checkResource[id] 2590: 2591: else: 2592: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],obj_ids=[id],search_sub=1) 2593: 2594: if not hasattr(self,"_v_checkResource"): self._v_checkResource={}#lege cache an falls nicht existent 2595: if resources: 2596: self._v_checkResource[id]=resources[0:] # slicing to be sure that data is stabil 2597: else: 2598: self._v_checkResource[id]=None 2599: 2600: return self._v_checkResource[id] 2601: 2602: def sendForm(self,fromaddr,content,server='mail.mpiwg-berlin.mpg.de'): 2603: """sendform""" 2604: toaddrs=["dwinter@mpiwg-berlin.mpg.de"] 2605: 2606: msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" 2607: % (fromaddr, ", ".join(toaddrs),"testsub")) 2608: server = smtplib.SMTP(server) 2609: #server.set_debuglevel(1) 2610: msg=msg+content 2611: server.sendmail(fromaddr, toaddrs, msg) 2612: server.quit() 2613: 2614: def generateFromRDFForm(self): 2615: """change form""" 2616: pt=zptFile(self, 'zpt/generateFromRDFForm') 2617: pt.content_type="text/html" 2618: return pt() 2619: 2620: def generateFromRDF(self,file,startNode="/Cuneiform Corpus"): 2621: 2622: """generate from RDF""" 2623: 2624: global seqs 2625: seqs={} 2626: global descrs 2627: descrs={} 2628: global key 2629: key="" 2630: global value 2631: value="" 2632: 2633: def getEdges(seqs,urn): 2634: """edges""" 2635: ret=[] 2636: return seqs[urn] 2637: 2638: def createSubs(self,seqs,descrs,urn,level=0): 2639: """create subs""" 2640: for edge in getEdges(seqs,urn): 2641: cn=createNode(self,descrs,edge) 2642: if cn[0]=="CDLI_group": 2643: createSubs(cn[1],seqs,descrs,cn[2],level+1) 2644: return 2645: 2646: def start_element(name,attrs): 2647: 2648: global seqs 2649: global descrs 2650: global key 2651: global value 2652: seq="" 2653: if name=="RDF:Seq": 2654: key=attrs.get('RDF:about') 2655: try: # teste ob liste 2656: x=seqs[key][0] 2657: except: 2658: 2659: seqs[key]=[] 2660: 2661: 2662: elif name=="RDF:Description": 2663: key=attrs.get('RDF:about') 2664: 2665: 2666: elif name=="RDF:li": 2667: name=attrs.get('RDF:resource') 2668: seqs[key].append(name) 2669: 2670: elif name=="ECHONAVIGATION:type": 2671: value="type" 2672: 2673: elif name=="ECHONAVIGATION:name": 2674: value="name" 2675: elif name=="ECHONAVIGATION:linkClickable": 2676: value="linkClickable" 2677: 2678: def end_element(name): 2679: """nothing""" 2680: key="" 2681: value="" 2682: 2683: def char_data(data): 2684: """nothing""" 2685: 2686: data=re.sub("\n","",data) 2687: try: 2688: if descrs[key].has_key(value): 2689: descrs[key][value]+=data 2690: else: 2691: descrs[key][value]=data 2692: except: 2693: 2694: descrs[key]={} 2695: descrs[key][value]=data 2696: 2697: p = xml.parsers.expat.ParserCreate() 2698: 2699: p.StartElementHandler = start_element 2700: p.EndElementHandler = end_element 2701: p.CharacterDataHandler = char_data 2702: 2703: 2704: p.ParseFile(file) 2705: self.REQUEST.RESPONSE.write("<html><body><h1>Start</h1>") 2706: createSubs(self,seqs,descrs,startNode) 2707: self.REQUEST.RESPONSE.write("<h1>done</h1></body></html>") 2708: #print "done" 2709: 2710: 2711: return "done" 2712: 2713: 2714: 2715: 2716: def changeWeightsInCollection(self): 2717: """change all lables of a collection""" 2718: ret="" 2719: argv=self.REQUEST.form 2720: 2721: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) 2722: for resource in resources: 2723: 2724: try: 2725: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>" 2726: resource[1].weight=argv[resource[1].getId()][0:] 2727: except: 2728: pass 2729: return ret 2730: 2731: def changeWeights(self): 2732: """change form""" 2733: pt=zptFile(self, 'zpt/changeWeightForm') 2734: pt.content_type="text/html" 2735: return pt() 2736: getSubCols = ECHO_helpers.getSubCols 2737: 2738: manage_options=Folder.manage_options+( 2739: {'label':'Main Config','action':'ECHO_copyright_configForm'}, 2740: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'}, 2741: {'label':'Change Weights','action':'changeWeights'}, 2742: {'label':'Generate from RDF','action':'generateFromRDFForm'}, 2743: 2744: ) 2745: 2746: 2747: 2748: def reloadMetaDataFromStorageWarning(self,RESPONSE=None): 2749: """warning""" 2750: pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt') 2751: pt.content_type="text/html" 2752: return pt() 2753: 2754: def reloadMetaDataFromStorage(self,RESPONSE=None): 2755: """reload MD from Storage""" 2756: 2757: return reloadMetaDataFromStorage(self,RESPONSE) 2758: 2759: def getRDF(self,urn=None): 2760: """rdf of the collection""" 2761: 2762: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection']) 2763: 2764: ret=getRDFDescription(self,self.absolute_url(),urn=urn) 2765: 2766: li="""<RDF:li RDF:resource="%s" />\n""" 2767: 2768: 2769: for content in contents: 2770: ret+=content[1].getRDF()+"\n" 2771: 2772: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn 2773: for content in contents: 2774: nurn=content[1].absolute_url() 2775: ret+=li%nurn 2776: return ret+"</RDF:Seq>" 2777: 2778: 2779: def showContent(self,path): 2780: """return content/html""" 2781: 2782: return ECHO_helpers.urlopen(path+"/content_html").read() 2783: 2784: def getImageViewers(self): 2785: """images""" 2786: viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject']) 2787: return viewers 2788: 2789: 2790: def getBibTag(self,tag,content): 2791: """get field tag for index-meta-generation""" 2792: if not content or content=="": 2793: return "" 2794: ret="<%s>"%tag 2795: #ret+=urllib.quote(content) 2796: ret+=content 2797: 2798: ret+="</%s>"%tag 2799: return ret 2800: 2801: def getValueFromClass(self,field,found): 2802: """retattribute falss existing""" 2803: try: 2804: 2805: return getattr(found,field).decode('ascii','ignore') 2806: except: 2807: return "" 2808: 2809: security.declarePublic('getImageTag') 2810: def getImageTag(self): 2811: """needed by main_template""" 2812: return "" 2813: 2814: secondaryLink="" #needed by main_template 2815: secondaryLinkTitle="" #needed by main_template 2816: 2817: def getBgcolour(self): 2818: """hack""" 2819: return "#dddddd" 2820: 2821: security.declareProtected('View','contentTypeSelector_HTML') 2822: def contentTypeSelector_HTML(self,selected=None): 2823: """give type selector""" 2824: if not selected: 2825: retStr="<option selected>\n" 2826: else: 2827: retStr="<option>\n" 2828: 2829: try: # erste version contentTypes exists 2830: for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType","OSAS_MetadataMapping"]): 2831: if selected and (contentType[0]==selected): 2832: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0]) 2833: else: 2834: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0]) 2835: except: 2836: try: 2837: for contentType in self.ZopeFind(self.standardMD,obj_metatypes=["OSAS_MetadataMapping"]): 2838: if selected and (contentType[0]==selected): 2839: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0]) 2840: else: 2841: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0]) 2842: except: 2843: """nothing""" 2844: 2845: return retStr 2846: 2847: def renderingTypeSelector_HTML(self,selected=None): 2848: """give type selector""" 2849: if not selected: 2850: retStr="<option selected>\n" 2851: else: 2852: retStr="<option>\n" 2853: 2854: try: # erste version renderingTypes exists 2855: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]): 2856: if selected and (renderingType[0]==selected): 2857: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0]) 2858: else: 2859: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0]) 2860: except: 2861: """nothing""" 2862: return retStr 2863: 2864: 2865: def copyrightTypeSelector_HTML(self, object=None, selected=None,first=None): 2866: """give type selector""" 2867: 2868: if not first: 2869: if not selected: 2870: retStr="<option selected>\n" 2871: else: 2872: retStr="<option>\n" 2873: else: 2874: if not selected: 2875: retStr="""<option selected value="%s">%s\n"""%first 2876: else: 2877: retStr="""<option value="%s">%s\n"""%first 2878: 2879: 2880: try: # erste version copyrightTypes exists 2881: for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]): 2882: if selected and (copyrightType[0]==selected): 2883: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0]) 2884: else: 2885: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0]) 2886: 2887: for copyrightTypeSelf in self.ZopeFind(object,obj_metatypes=["ECHO_copyrightType"],search_sub=1): 2888: if selected and (copyrightTypeSelf[0]==selected): 2889: retStr+="""<option selected value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0]) 2890: else: 2891: retStr+="""<option value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0]) 2892: 2893: except: 2894: """nothing""" 2895: 2896: return retStr 2897: 2898: def partnerSelector_HTML(self,selected=None): 2899: """give type selector""" 2900: if not selected: 2901: retStr="<option selected>\n" 2902: else: 2903: retStr="<option>\n" 2904: 2905: try: # erste version copyrightTypes exists 2906: for copyrightType in self.ZopeFind(self.partners,obj_metatypes=["ECHO_partner"]): 2907: if selected and (copyrightType[0]==selected): 2908: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0]) 2909: else: 2910: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0]) 2911: except: 2912: """nothing""" 2913: return retStr 2914: 2915: mediaTypes=['all','text','images','sound','video'] # konfigurierbar in neuer version ueber echoroot?? 2916: 2917: def mediaTypeSelector_HTML(self,selected=None): 2918: """give type selector""" 2919: if not selected: 2920: retStr="<option selected>\n" 2921: else: 2922: retStr="<option>\n" 2923: 2924: try: # erste version mediatypesTypes exists 2925: for mediaType in self.mediaTypes: 2926: if selected and (mediaType in selected): 2927: retStr+="""<option selected value="%s">%s\n"""%(mediaType,mediaType) 2928: else: 2929: retStr+="""<option value="%s">%s\n"""%(mediaType,mediaType) 2930: except: 2931: """nothing""" 2932: return retStr 2933: 2934: 2935: def patchContentType(self,obj=None): 2936: """austauschen content_type with contentType (patch bei umstieg von alter Version)""" 2937: 2938: 2939: if not obj: 2940: obj = self 2941: 2942: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate']) 2943: 2944: for entry in entries: 2945: setattr(entry[1],'contentType',entry[1].content_type) 2946: #entry[1].contentType == entry[1].content_type 2947: 2948: if entry[1].meta_type == 'ECHO_collection': 2949: entry[1].patchContentType(entry[1]) 2950: 2951: 2952: return "changed all contenttypes in: "+self.title 2953: 2954: 2955: def repairAllCoords(self): 2956: """updates map coordinates on the same and sublevels""" 2957: return repairCoords(self) 2958: 2959: 2960: def patchViewClassification(self,obj=None): 2961: """setze viewClassification heuristisch""" 2962: 2963: def checkIfArrow(obj): 2964: if hasattr(obj,'coords'): 2965: for coordtemp in obj.coords: 2966: 2967: if (len(coordtemp)>4) and not (coordtemp[4]==''): 2968: return 4 2969: return None 2970: return None 2971: 2972: if not obj: 2973: obj = self 2974: 2975: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group']) 2976: 2977: for entry in entries: 2978: 2979: if checkIfArrow(entry[1]): 2980: setattr(entry[1],'viewClassification','view point') 2981: else: 2982: setattr(entry[1],'viewClassification','area') 2983: 2984: #entry[1].contentType == entry[1].content_type 2985: 2986: if entry[1].meta_type in ['ECHO_collection','ECHO_group']: 2987: entry[1].patchViewClassification(entry[1]) 2988: 2989: 2990: return "changed all contenttypes in: "+self.title 2991: 2992: def deleteCache(self,obj=None,RESPONSE=None): 2993: """setze alle collections auf cache = CacheManager""" 2994: if not obj: 2995: obj = self 2996: entries=obj.ZopeFind(obj,search_sub=1) 2997: for entry in entries: 2998: if hasattr(entry[1],'_v_hash'): 2999: entry[1]._v_hash=None 3000: 3001: return "changed all CM in: "+self.title 3002: 3003: 3004: security.declarePublic('ECHO_newViewerLink') 3005: def ECHO_newViewerLink(self,obj=None): 3006: """change links (:86 faellt weg)""" 3007: 3008: if not obj: 3009: obj = self 3010: 3011: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection']) 3012: 3013: for entry in entries: 3014: 3015: if entry[1].meta_type == 'ECHO_resource': 3016: 3017: entry[1].link=re.sub('\:86','',entry[1].link) 3018: 3019: else: 3020: 3021: entry[1].ECHO_newViewerLink(entry[1]) 3022: 3023: return "Rerenderd all links to resources in: "+self.title 3024: 3025: def __init__(self,id,title): 3026: """init""" 3027: self.id = id 3028: self.title=title 3029: 3030: def deleteSpace(self,str): 3031: """delete space at the end of a line""" 3032: if str[len(str)-1]==" ": 3033: return str[0:len(str)-1] 3034: else: 3035: return str 3036: 3037: 3038: 3039: # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt 3040: 3041: def formatAscii(self,str,url=None): 3042: """ersetze ascii umbrueche durch <br>""" 3043: #url=None 3044: if url: 3045: 3046: retStr="" 3047: words=str.split("\n") 3048: 3049: for word in words: 3050: strUrl=url%word 3051: 3052: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word) 3053: str=retStr 3054: if str: 3055: return re.sub(r"[\n]","<br/>",str) 3056: else: 3057: return "" 3058: 3059: def link2html(self,str): 3060: """link2html fuer VLP muss hier noch raus""" 3061: if str: 3062: 3063: str=re.sub("\&","&",str) 3064: dom=xml.dom.minidom.parseString("<?xml version='1.0' encoding='utf-8'?><txt>"+str+"</txt>") 3065: links=dom.getElementsByTagName("link") 3066: 3067: 3068: for link in links: 3069: link.tagName="a" 3070: ref=link.getAttribute("ref") 3071: pn=link.getAttribute("page") 3072: 3073: if self.checkRef(ref): 3074: if pn: 3075: link.setAttribute("href",self.aq_parent.absolute_url()+"/references?id="+ref+"&page="+pn) 3076: else: 3077: link.setAttribute("href",self.aq_parent.absolute_url()+"/references?id="+ref) 3078: 3079: 3080: newxml=dom.toxml('utf-8') 3081: 3082: retStr=regexpTXT.search(newxml) 3083: 3084: return retStr.group(1) 3085: 3086: 3087: return "" 3088: 3089: def xml2html(self,str,quote="yes"): 3090: """link2html fuer VLP muss hier noch raus""" 3091: 3092: if str: 3093: if quote=="yes2": 3094: str=re.sub("\&","&",str) 3095: #dom=xml.dom.minidom.parseString(str) 3096: dom = NonvalidatingReader.parseString(str,"http://www.mpiwg-berlin.mpg.de/") 3097: #links=dom.getElementsByTagName("link") 3098: links=Ft.Xml.XPath.Evaluate(".//link", contextNode=dom) 3099: for link in links: 3100: #link.tagName="a" 3101: 3102: ref=link.getAttributeNS(EMPTY_NAMESPACE,"ref") 3103: pn=link.getAttributeNS(EMPTY_NAMESPACE,"page") 3104: 3105: cns=link.childNodes[0:] 3106: 3107: newLink=dom.createElementNS(EMPTY_NAMESPACE,"a") 3108: for x in cns: 3109: newLink.appendChild(x) 3110: 3111: 3112: 3113: link.parentNode.replaceChild(newLink,link) 3114: if self.checkRef(ref): 3115: if pn: 3116: newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref+"&p="+pn) 3117: else: 3118: newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref) 3119: 3120: #str= dom.toxml('utf-8') 3121: buf = cStringIO.StringIO() 3122: PrettyPrint(dom, stream=buf) 3123: str = buf.getvalue() 3124: buf.close() 3125: #str=PrettyPrint(dom.documentElement,encoding='UTF-8') 3126: #print link.toxml('utf-8') 3127: #print type(str) 3128: retStr=regexpPage.search(str) 3129: 3130: try: # hack warum fehtl manchmal page?? 3131: return retStr.group(1) 3132: except: 3133: return str 3134: return "" 3135: 3136: def checkRef(self,ref): 3137: if ref[0:3]=='lit': 3138: if len(self.library_data({ 'id':ref}))>0: 3139: return 1 3140: try: 3141: if ref[0:7]=="tec_cat": 3142: return 1 3143: except: 3144: """nothing""" 3145: 3146: dbs={'vl_technology':'','vl_people':" AND complete='yes'",'vl_sites':''} 3147: res=None 3148: for db in dbs.keys(): 3149: res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db]))) 3150: return res 3151: 3152: #Ende Methode fuer vlp 3153: 3154: def PgQuoteString(self,string): 3155: """Quote string""" 3156: 3157: return libpq.PgQuoteString(string) 3158: 3159: security.declareProtected('View','getPartners') 3160: def getPartners(self): 3161: """Get list of Partners. Presently only from a subfolder partners""" 3162: if hasattr(self,'partners'): 3163: return [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])] 3164: else: 3165: return [] 3166: 3167: def getInstitutions(self): 3168: """Get list of Partners. Presently only from a subfolder partners""" 3169: 3170: return [ item[1] for item in self.institutions.ZopeFind(self.institutions,obj_metatypes=['ECHO_institution'])] 3171: 3172: 3173: def getPartnersXML(self): 3174: """partner liste als xml""" 3175: partners=self.getPartners() 3176: ret="""<?xml version="1.0" encoding="utf-8" ?> 3177: <partners>""" 3178: 3179: for partner in partners: 3180: ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),partner.title) 3181: 3182: return ret+"\n</partners>" 3183: 3184: def getCollectionTree(self): 3185: """get the collection tree (list of triples (parent,child, depth)""" 3186: 3187: def getCollection(object,depth=0): 3188: depth+=1 3189: collections=[] 3190: for entry in object.__dict__.keys(): 3191: element=getattr(object,entry) 3192: try: 3193: if element.meta_type=="ECHO_collection": 3194: collections.append((object,element,depth)) 3195: collections+=getCollection(element,depth) 3196: except: 3197: """nothing""" 3198: return collections 3199: 3200: 3201: return getCollection(self) 3202: 3203: def getCollectionTreeIds(self): 3204: """Show the IDs of the Tree""" 3205: ret=[] 3206: for collection in self.getCollectionTree(): 3207: ret.append((collection[0].getId(),collection[1].getId(),collection[2])) 3208: return ret 3209: 3210: def getResourcesHTML(self,viewerType=None,filter=None): 3211: """gebe all ressourcen aus""" 3212: 3213: def sortHTML(x,y): 3214: return cmp(x[1].title,y[1].title) 3215: 3216: ret="""<html><body><h2>Resources in ECHO</h3>""" 3217: 3218: resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) 3219: ret+="""<h3>Found %i resources</h3>"""%len(resources) 3220: resources.sort(sortHTML) 3221: for resource in resources: 3222: echo_url=resource[1].absolute_url() 3223: 3224: if hasattr(resource[1],'title'): 3225: title=resource[1].title 3226: else: 3227: title="None" 3228: if filter: 3229: if re.search(filter,title): 3230: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title) 3231: else: 3232: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title) 3233: 3234: ret +="""\n</body></html>""" 3235: 3236: #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html") 3237: #self.REQUEST.RESPONSE.write(ret) 3238: return ret 3239: 3240: def getResourcesXML(self,viewerType=None,filter=None): 3241: """gebe all ressourcen aus""" 3242: ret="""<?xml version="1.0" ?> 3243: <index>""" 3244: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1): 3245: 3246: echo_url=resource[1].absolute_url() 3247: if hasattr(resource[1],'link'): 3248: viewer_url=resource[1].link 3249: else: 3250: viewer_url="NO URL" 3251: if filter: 3252: if re.search(filter,viewer_url): 3253: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?')) 3254: else: 3255: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?')) 3256: ret +="""\n</index>""" 3257: 3258: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml") 3259: self.REQUEST.RESPONSE.write(ret) 3260: 3261: def getFullTextsXML(self,viewerType=None,filter=None): 3262: """gebe all ressourcen aus""" 3263: ret="""<?xml version="1.0" ?> 3264: <index>""" 3265: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1): 3266: 3267: echo_url=resource[1].absolute_url() 3268: if resource[1].getFullTextXML(noredirect="yes"): 3269: if hasattr(resource[1],'link'): 3270: viewer_url=echo_url+"/getFullTextXML" 3271: else: 3272: viewer_url="NO URL" 3273: if filter: 3274: if re.search(filter,viewer_url): 3275: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?')) 3276: else: 3277: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?')) 3278: ret +="""\n</index>""" 3279: 3280: 3281: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml") 3282: self.REQUEST.RESPONSE.write(ret) 3283: 3284: 3285: def getMetaDatasXML(self,viewerType=None,filter=None): 3286: """gebe all ressourcen aus""" 3287: # check if the request's host part was OK 3288: http_host = self.REQUEST['HTTP_HOST'] 3289: host_port = self.REQUEST['SERVER_PORT'] 3290: fix_host = None 3291: if http_host and http_host.rfind(host_port) == -1: 3292: print "HTTP_HOST needs fixing!" 3293: fix_host = http_host + ":" + host_port 3294: 3295: ret="""<?xml version="1.0" ?> 3296: <index>""" 3297: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1): 3298: 3299: echo_url=resource[1].absolute_url() 3300: if fix_host: 3301: #print "replacing ", http_host, " by ", fix_host 3302: echo_url = string.replace(echo_url, http_host, fix_host, 1) 3303: 3304: if hasattr(resource[1],'link'): 3305: meta_url=echo_url+"/getMetaDataXML" 3306: else: 3307: meta_url="NO_URL" 3308: 3309: if filter and not re.search(filter,viewer_url): 3310: continue 3311: 3312: #modificationDate=time.strptime(str(resource[1].bobobase_modification_time()),"%Y/%m/%d %H:%M:%S %Z") 3313: 3314: modificationDate=resource[1].bobobase_modification_time().strftime("%Y/%m/%d %H:%M:%S") 3315: 3316: ret+="""\n<resource resourceLink="%s" metaLink="%s" modificationDate="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(meta_url,safe='/:?'),modificationDate) 3317: 3318: 3319: ret +="""\n</index>""" 3320: 3321: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml") 3322: self.REQUEST.RESPONSE.write(ret) 3323: 3324: 3325: def findPartners(self): 3326: """find all partners in partners""" 3327: par=self.ZopeFind(self.partners, obj_metatypes='ECHO_partner') 3328: return par 3329: 3330: def getPartnerFromID(self): 3331: """find partner form ID return object""" 3332: pa=self.REQUEST['partner'] 3333: par=self.ZopeFind(self.partners, obj_ids=[pa]) 3334: return par 3335: 3336: def getPartnerFromIDParameter(self, id): 3337: """ find partners from ID""" 3338: par=self.ZopeFind(self.partners, obj_ids=[id]) 3339: return par 3340: 3341: def getInstitutionFromID(self,id): 3342: """ find institution from id """ 3343: inst=self.ZopeFind(self.institutions, obj_ids=[id]) 3344: return inst 3345: 3346: 3347: def manage_addECHO_root(self,id,title,RESPONSE=None): 3348: """Add an ECHO_root""" 3349: self._setObject(id,ECHO_root(id,title)) 3350: 3351: if RESPONSE is not None: 3352: RESPONSE.redirect('manage_main') 3353: 3354: def manage_addECHO_rootForm(self): 3355: """Nothing yet""" 3356: pt=zptFile(self, 'zpt/AddECHO_root.zpt') 3357: return pt() 3358: 3359: class ECHO_copyrightType(Folder,ECHO_basis): 3360: """copyright typ""" 3361: 3362: meta_type="ECHO_copyrightType" 3363: 3364: def __init__(self,id,title,label,url): 3365: """init""" 3366: self.id=id 3367: self.title=title 3368: self.label=label 3369: self.url=url 3370: 3371: manage_options = Folder.manage_options+( 3372: {'label':'Main Config','action':'ECHO_copyrightType_config_mainForm'}, 3373: ) 3374: 3375: def ECHO_copyrightType_config_mainForm(self): 3376: """change form""" 3377: pt=zptFile(self, 'zpt/ChangeECHO_copyrightType') 3378: pt.content_type="text/html" 3379: return pt() 3380: 3381: def ECHO_copyrightType_config_main(self,title,label,url,RESPONSE=None): 3382: """change""" 3383: self.title=title 3384: self.label=label 3385: self.url=url 3386: 3387: if RESPONSE is not None: 3388: RESPONSE.redirect('manage_main') 3389: 3390: def manage_addECHO_copyrightTypeForm(self): 3391: """Form for adding a ressource""" 3392: pt=zptFile(self, 'zpt/AddECHO_copyrightTypeForm.zpt') 3393: return pt() 3394: 3395: 3396: def manage_addECHO_copyrightType(self,id,title,label,url,RESPONSE=None): 3397: """addaresource""" 3398: 3399: newObj=ECHO_copyrightType(id,title,label,url) 3400: 3401: self._setObject(id,newObj) 3402: 3403: if RESPONSE is not None: 3404: RESPONSE.redirect('manage_main') 3405: 3406: 3407: 3408: class ECHO_partner(Image,Persistent,ECHO_basis): 3409: """ECHO Partner""" 3410: 3411: meta_type="ECHO_partner" 3412: 3413: def __init__(self, id, title,url, file, copyrightType, person, email, country, color, content_type='', precondition=''): 3414: self.__name__=id 3415: self.title=title 3416: self.url=url 3417: self.person=person 3418: self.email=email 3419: self.country=country 3420: self.color=color 3421: self.precondition=precondition 3422: self.copyrightType=copyrightType 3423: data, size = self._read_data(file) 3424: content_type=self._get_content_type(file, data, id, content_type) 3425: self.update_data(data, content_type, size) 3426: 3427: manage_options = Image.manage_options+( 3428: {'label':'Partner Information','action':'ECHO_partner_config'}, 3429: ) 3430: 3431: 3432: def changeECHO_partner(self,url,copyrightType,person, email, country, color, RESPONSE=None): 3433: """Change main information""" 3434: self.url=url 3435: self.person=person 3436: self.email=email 3437: self.country=country 3438: self.color=color 3439: self.copyrightType=copyrightType 3440: if RESPONSE is not None: 3441: RESPONSE.redirect('manage_main') 3442: 3443: 3444: 3445: def ECHO_partner_config(self): 3446: """Main configuration""" 3447: if not hasattr(self,'url'): 3448: self.url="" 3449: pt=zptFile(self, 'zpt/ChangeECHO_partner.zpt') 3450: return pt() 3451: 3452: 3453: manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(), 3454: Kind='ECHO_partner',kind='ECHO_partner') 3455: 3456: 3457: 3458: def manage_addECHO_partner(self, id, url, person, email, country, color, file=None, copyrightType='', title='', precondition='', content_type='', 3459: REQUEST=None): 3460: """ 3461: Add a new ECHO_partner object. 3462: 3463: Creates a new ECHO_partner object 'id' with the contents of 'file'. 3464: Based on Image.manage_addImage 3465: """ 3466: 3467: id=str(id) 3468: title=str(title) 3469: content_type=str(content_type) 3470: precondition=str(precondition) 3471: 3472: id, title = OFS.Image.cookId(id, title, file) 3473: 3474: self=self.this() 3475: 3476: # First, we create the image without data: 3477: self._setObject(id, ECHO_partner(id,title,url,'',copyrightType, person, email, country, color, content_type, precondition)) 3478: 3479: # Now we "upload" the data. By doing this in two steps, we 3480: # can use a database trick to make the upload more efficient. 3481: if file: 3482: self._getOb(id).manage_upload(file) 3483: if content_type: 3484: self._getOb(id).content_type=content_type 3485: 3486: if REQUEST is not None: 3487: try: url=self.DestinationURL() 3488: except: url=REQUEST['URL1'] 3489: REQUEST.RESPONSE.redirect('%s/manage_main' % url) 3490: return id 3491: 3492: class ECHO_linkList(ZopePageTemplate,ECHO_basis): 3493: """LinkList Objekt""" 3494: meta_type="ECHO_linkList" 3495: 3496: _default_content_fn = os.path.join(package_home(globals()), 'html/ECHO_pageTemplateDefault.html') 3497: 3498: manage_options = ZopePageTemplate.manage_options+( 3499: {'label':'Main Config','action':'changeECHO_linkListWeightForm'}, 3500: ) 3501: 3502: def content_html(self): 3503: """content_html""" 3504: return ECHO_basis.content_html(self,'pageTemplate') 3505: 3506: def changeECHO_linkListWeightForm(self): 3507: """change""" 3508: pt=zptFile(self, 'zpt/ChangeECHO_linkListTemplate.zpt') 3509: return pt() 3510: 3511: def changeECHO_linkListWeight(self,contentType,label,RESPONSE=None): 3512: """change""" 3513: self.contentType=contentType 3514: self.label=label 3515: 3516: if RESPONSE is not None: 3517: RESPONSE.redirect('manage_main') 3518: 3519: def getLabel(self): 3520: if hasattr(self,'label'): 3521: return self.label.encode('utf-8') 3522: else: 3523: return 0 3524: 3525: def getcontentType(self): 3526: """get contentType""" 3527: if hasattr(self,'contentType'): 3528: return self.contentType 3529: else: 3530: return 0 3531: 3532: def __init__(self, id, label, title=None, text=None, contentType=None): 3533: self.id = str(id) 3534: self.title=title 3535: self.label=label 3536: self.ZBindings_edit(self._default_bindings) 3537: if text is None: 3538: text = '' 3539: self.pt_edit(text, contentType) 3540: 3541: 3542: 3543: 3544: def manage_addECHO_linkListForm(self): 3545: """Form for adding""" 3546: pt=zptFile(self, 'zpt/AddECHO_linkListTemplate.zpt') 3547: return pt() 3548: 3549: 3550: def manage_addECHO_linkList(self, id, label,contentType=0,title=None, text=None, 3551: REQUEST=None, submit=None): 3552: """Add a LinkList with optional file content.""" 3553: 3554: id = str(id) 3555: if REQUEST is None: 3556: self._setObject(id, ECHO_linkList(id, label, text)) 3557: ob = getattr(self, id) 3558: setattr(ob,'contentType',contentType) 3559: if title: 3560: ob.pt_setTitle(title) 3561: return ob 3562: else: 3563: file = REQUEST.form.get('file') 3564: headers = getattr(file, 'headers', None) 3565: if (headers is None) or (not file.filename): 3566: zpt = ECHO_linkList(id, file) 3567: else: 3568: zpt = ECHO_linkList(id, label,'', file, headers.get('contentType')) 3569: 3570: self._setObject(id, zpt) 3571: ob = getattr(self, id) 3572: if title: 3573: ob.pt_setTitle(title) 3574: 3575: try: 3576: u = self.DestinationURL() 3577: except AttributeError: 3578: u = REQUEST['URL1'] 3579: 3580: if submit == " Add and Edit ": 3581: u = "%s/%s" % (u, urllib.quote(id)) 3582: REQUEST.RESPONSE.redirect(u+'/manage_main') 3583: return '' 3584: 3585: 3586: class ECHO_support(Folder,ECHO_basis): 3587: """gefoerdert durch""" 3588: meta_type="ECHO_support" 3589: 3590: 3591: 3592: def __init__(self,id,institutions=None): 3593: """init""" 3594: self.id=id 3595: self.title='' 3596: self.institutions=toList(institutions) 3597: 3598: def getSupporter(self): 3599: """return institutions""" 3600: if self.institutions: 3601: return self.institutions 3602: else: 3603: return [] 3604: 3605: manage_options = Folder.manage_options+( 3606: {'label':'Main Config','action':'ECHO_support_configForm'}, 3607: ) 3608: 3609: def ECHO_support_configForm(self): 3610: """change form""" 3611: pt=zptFile(self, 'zpt/ChangeECHO_support') 3612: pt.content_type="text/html" 3613: return pt() 3614: 3615: def ECHO_support_config(self,institutions=None,RESPONSE=None): 3616: """change""" 3617: self.institutions=toList(institutions) 3618: 3619: if RESPONSE is not None: 3620: RESPONSE.redirect('manage_main') 3621: 3622: 3623: def manage_addECHO_supportForm(self): 3624: """Form for adding""" 3625: pt=zptFile(self, 'zpt/AddECHO_support.zpt') 3626: return pt() 3627: 3628: def manage_addECHO_support(self, id,institutions=None,RESPONSE=None): 3629: """add the copyright""" 3630: 3631: meta_type="ECHO_support" 3632: 3633: 3634: self._setObject(id, ECHO_support(id,institutions)) 3635: 3636: if RESPONSE is not None: 3637: RESPONSE.redirect('manage_main') 3638: 3639: 3640: class ECHO_institution(Image,Persistent,ECHO_basis): 3641: """ECHO Institution""" 3642: 3643: meta_type="ECHO_institution" 3644: 3645: def __init__(self, id, title,url, file, person, email, country, content_type='', precondition=''): 3646: self.__name__=id 3647: self.title=title 3648: self.url=url 3649: self.person=person 3650: self.email=email 3651: self.country=country 3652: self.precondition=precondition 3653: data, size = self._read_data(file) 3654: content_type=self._get_content_type(file, data, id, content_type) 3655: self.update_data(data, content_type, size) 3656: 3657: manage_options = Image.manage_options+( 3658: {'label':'Institution Information','action':'ECHO_institution_config'}, 3659: ) 3660: 3661: 3662: def changeECHO_institution(self,url,person, email, country,RESPONSE=None): 3663: """Change main information""" 3664: self.url=url 3665: self.person=person 3666: self.email=email 3667: self.country=country 3668: if RESPONSE is not None: 3669: RESPONSE.redirect('manage_main') 3670: 3671: 3672: 3673: def ECHO_institution_config(self): 3674: """Main configuration""" 3675: if not hasattr(self,'url'): 3676: self.url="" 3677: pt=zptFile(self, 'zpt/ChangeECHO_institution.zpt') 3678: return pt() 3679: 3680: 3681: manage_addECHO_institutionForm=DTMLFile('dtml/ECHO_institutionAdd',globals(), 3682: Kind='ECHO_institution',kind='ECHO_institution') 3683: 3684: 3685: 3686: def manage_addECHO_institution(self, id, url, person, email, country, file=None, title='', precondition='', content_type='', 3687: REQUEST=None): 3688: """ 3689: Add a new ECHO_institution object. 3690: 3691: Creates a new ECHO_institution object 'id' with the contents of 'file'. 3692: Based on Image.manage_addImage 3693: """ 3694: 3695: id=str(id) 3696: title=str(title) 3697: content_type=str(content_type) 3698: precondition=str(precondition) 3699: 3700: id, title = OFS.Image.cookId(id, title, file) 3701: 3702: self=self.this() 3703: 3704: # First, we create the image without data: 3705: self._setObject(id, ECHO_institution(id,title,url,'', person, email, country, content_type, precondition)) 3706: 3707: # Now we "upload" the data. By doing this in two steps, we 3708: # can use a database trick to make the upload more efficient. 3709: if file: 3710: self._getOb(id).manage_upload(file) 3711: if content_type: 3712: self._getOb(id).content_type=content_type 3713: 3714: if REQUEST is not None: 3715: try: url=self.DestinationURL() 3716: except: url=REQUEST['URL1'] 3717: REQUEST.RESPONSE.redirect('%s/manage_main' % url) 3718: return id 3719: 3720: def repairCoords(self): 3721: """updates map coordinates to new MapArea objects""" 3722: msg = "" 3723: for cols in self.ZopeFind(self, obj_metatypes=['ECHO_collection','ECHO_resource'], search_sub=1): 3724: col = cols[1] 3725: if not hasattr(col, 'coords'): 3726: continue 3727: print "fixing: ", col.id 3728: msg += "fixing: "+col.id+"\n" 3729: coords = col.coords 3730: if len(coords) > 0: 3731: # delete old MapAreas 3732: for areas in self.ZopeFind(col, obj_metatypes=['MapArea']): 3733: #area = areas[1] 3734: id = areas[0] 3735: print " deleting: ", id 3736: msg += " deleting: "+id+"\n" 3737: col._delObject(id) 3738: # add new MapAreas 3739: areacnt = 0 3740: for coord in coords: 3741: if len(coord) < 4: 3742: continue 3743: type = col.viewClassification 3744: if type == 'view point': 3745: type = 'arrow' 3746: if type is None: 3747: if len(coord) > 4: 3748: type = 'arrow' 3749: else: 3750: type = 'area' 3751: newid = "a%02d"%areacnt 3752: areacnt += 1 3753: area = MapArea(newid, coord, type=type) 3754: print " adding: ", newid 3755: msg += " adding: "+newid+"\n" 3756: col.addMapArea(area) 3757: msg += "\nDone!" 3758: return msg