Annotation of ECHO_content/ECHO_collection.py, revision 1.292
1.13 dwinter 1: """New version of the product started February, 8th. Without scientific classification, use content-type for further classification."""
1.1 casties 2: """Echo collection provides the classes for the ECHO content web-site.
3:
4: class ECHO_collection is the basis class for an ECHO collection.
5:
6: class ECHO_resource contains information on ECHO resources (e.g. an Display environment for Metadata
7:
8: class ECHO_externalLink contains information on externalLinks
9:
10:
11: """
1.194 dwinter 12: try:
1.236 dwinter 13: from reportlab.pdfgen import canvas
14: from reportlab.lib.pagesizes import A4
1.194 dwinter 15: except:
1.236 dwinter 16: print "PDF generation will not work"
1.238 dwinter 17:
1.258 dwinter 18: import urlparse
1.1 casties 19: import string
1.192 dwinter 20: import tempfile
1.275 dwinter 21: import zipfile
1.14 dwinter 22: import re
1.275 dwinter 23: import os,shutil
1.1 casties 24: import OFS.Image
25: from types import *
1.154 dwinter 26: from OFS.Cache import Cacheable
1.1 casties 27: from OFS.Image import Image
28: from Globals import DTMLFile
29: from OFS.Folder import Folder
30: from OFS.SimpleItem import SimpleItem
31: from AccessControl import ClassSecurityInfo
1.85 dwinter 32: from AccessControl.User import UserFolder
1.1 casties 33: from Globals import InitializeClass
34: from Globals import DTMLFile
1.84 dwinter 35: import Globals
1.1 casties 36: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
37: from Products.PageTemplates.PageTemplate import PageTemplate
1.268 dwinter 38: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate,manage_addPageTemplate
1.29 dwinter 39: from Globals import Persistent, package_home
1.1 casties 40: from Acquisition import Implicit
1.236 dwinter 41: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
1.267 dwinter 42: from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon
1.189 dwinter 43:
1.141 dwinter 44: import urllib
1.286 dwinter 45: import urllib2
1.225 dwinter 46: import cgi
1.177 dwinter 47: import smtplib
1.153 dwinter 48: import time
1.173 dwinter 49: from Ft.Xml.Domlette import NonvalidatingReader
1.236 dwinter 50: from Ft.Xml.Domlette import PrettyPrint, Print
1.173 dwinter 51: from Ft.Xml import EMPTY_NAMESPACE
52:
53: import Ft.Xml.XPath
54: import cStringIO
1.284 dwinter 55:
1.258 dwinter 56: import sys
1.84 dwinter 57:
1.50 dwinter 58: try:
1.236 dwinter 59: from psycopg import libpq
1.50 dwinter 60: except:
1.236 dwinter 61: try:
62: from pyPgSQL import libpq
63: except:
64: print "ECHO_collection: Warning - No libpq imported!"
65:
1.14 dwinter 66: import xml.dom.minidom
1.1 casties 67:
68: import urllib
69: import xml.dom.minidom
1.41 dwinter 70: import ECHO_helpers
1.189 dwinter 71: from ECHO_helpers import *
1.277 dwinter 72:
1.276 dwinter 73: try:
74: from ECHO_language import *
75: except:
76: print "no echo_language"
1.277 dwinter 77: class ECHO_language:
1.286 dwinter 78: """ leere Klasse"""
79: pass
1.277 dwinter 80:
1.217 dwinter 81: from ECHO_movie import *
1.239 dwinter 82: import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen
1.258 dwinter 83: import xmlrpclib
1.274 dwinter 84:
1.284 dwinter 85: import logging
1.1 casties 86:
1.284 dwinter 87: #ersetzt logging.info
88: def logger(txt,method,txt2):
89: """logging"""
90: logging.info(txt+ txt2)
1.277 dwinter 91:
92: def normalizeCt(str):
1.286 dwinter 93: """normalizes content_type"""
94: #str= str.replace(" ","_")
95: return str.replace("-"," ").lower()
1.277 dwinter 96:
1.202 casties 97: def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""):
1.1 casties 98:
99: """Allegemeine Informationen zu einer ECHO Collection"""
100:
101: self.label = label
102: self.title=title
103: self.description=description
1.27 dwinter 104: self.contentType=contentType
1.1 casties 105: self.responsible=responsible
106: self.credits=toList(credits)
107: self.weight=weight
108:
1.256 dwinter 109: class ECHO_partner(Image,Persistent,ECHO_basis):
110: """ECHO Partner"""
111:
112: meta_type="ECHO_partner"
113:
114: def __init__(self, id, title,url, file, copyrightType, person, email, country, color, content_type='', precondition=''):
115: self.__name__=id
116: self.title=title
117: self.url=url
118: self.person=person
119: self.email=email
120: self.country=country
121: self.color=color
122: self.precondition=precondition
123: self.copyrightType=copyrightType
124: data, size = self._read_data(file)
125: content_type=self._get_content_type(file, data, id, content_type)
126: self.update_data(data, content_type, size)
127:
128: manage_options = Image.manage_options+(
129: {'label':'Partner Information','action':'ECHO_partner_config'},
130: )
131:
132:
133: def changeECHO_partner(self,url,copyrightType,person, email, country, color, RESPONSE=None):
134: """Change main information"""
135: self.url=url
136: self.person=person
137: self.email=email
138: self.country=country
139: self.color=color
140: self.copyrightType=copyrightType
141: if RESPONSE is not None:
142: RESPONSE.redirect('manage_main')
143:
144:
145:
146: def ECHO_partner_config(self):
147: """Main configuration"""
148: if not hasattr(self,'url'):
149: self.url=""
150: pt=zptFile(self, 'zpt/ChangeECHO_partner.zpt')
151: return pt()
152:
153:
154: manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(),
155: Kind='ECHO_partner',kind='ECHO_partner')
156:
157:
158:
159: def manage_addECHO_partner(self, id, url, person, email, country, color, file=None, copyrightType='', title='', precondition='', content_type='',
160: REQUEST=None):
161: """
162: Add a new ECHO_partner object.
163:
164: Creates a new ECHO_partner object 'id' with the contents of 'file'.
165: Based on Image.manage_addImage
166: """
167:
168: id=str(id)
169: title=str(title)
170: content_type=str(content_type)
171: precondition=str(precondition)
172:
173: id, title = OFS.Image.cookId(id, title, file)
174:
175: self=self.this()
176:
177: # First, we create the image without data:
178: self._setObject(id, ECHO_partner(id,title,url,'',copyrightType, person, email, country, color, content_type, precondition))
179:
180: # Now we "upload" the data. By doing this in two steps, we
181: # can use a database trick to make the upload more efficient.
182: if file:
183: self._getOb(id).manage_upload(file)
184: if content_type:
185: self._getOb(id).content_type=content_type
186:
187: if REQUEST is not None:
188: try: url=self.DestinationURL()
189: except: url=REQUEST['URL1']
190: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
191: return id
192:
1.228 dwinter 193: class ECHO_locale(ZopePageTemplate):
1.236 dwinter 194: """localisierung"""
1.228 dwinter 195:
1.236 dwinter 196: meta_type="ECHO_locale"
1.228 dwinter 197:
1.236 dwinter 198: def __init__(self,id,lang,title,label,text=None,content_type=None):
199: self.lang=lang
200: self.title=title
201: self.label=label
202: if text:
1.290 casties 203: if content_type is None:
204: content_type = self.content_type
1.236 dwinter 205: self.pt_edit(text, content_type)
206: self.id=id
207:
208: manage_options = ZopePageTemplate.manage_options+(
209: {'label':'Main Config','action':'change_ECHO_localeForm'},
210: )
211:
212: def change_ECHO_localeForm(self):
213: """change form"""
214: pt=zptFile(self, 'zpt/ChangeECHO_localeForm.zpt')
215: return pt()
216:
217: def change_ECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
218: """change echo locale"""
219: self.lang=lang
220: self.title=title
221: self.label=label
222: if not text is None:
1.290 casties 223: if content_type is None:
224: content_type = self.content_type
1.236 dwinter 225: self.pt_edit(text, content_type)
1.228 dwinter 226:
1.236 dwinter 227: if RESPONSE is not None:
228: RESPONSE.redirect('manage_main')
1.228 dwinter 229:
1.236 dwinter 230:
1.228 dwinter 231: def manage_addECHO_localeForm(self):
1.236 dwinter 232: """Form for adding"""
233: pt=zptFile(self, 'zpt/AddECHO_localeForm.zpt')
234: return pt()
1.228 dwinter 235:
236: def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None):
1.236 dwinter 237: """add echo locale"""
1.228 dwinter 238:
1.236 dwinter 239: id="locale_"+lang
240:
241: self._setObject(id, ECHO_locale(id,lang,title,label,text,content_type))
242: if RESPONSE is not None:
243: RESPONSE.redirect('manage_main')
1.228 dwinter 244:
245:
1.189 dwinter 246: class ECHO_copyright(Folder,ECHO_basis):
1.236 dwinter 247: """Copyright informationen"""
248: meta_type="ECHO_copyright"
249:
250:
251:
252: def __init__(self,id,title,copyrights):
253: """init"""
254: self.title=title
255: self.id=id
256: self.copyrights=copyrights[0:]
1.1 casties 257:
1.236 dwinter 258: def getCopyrights(self):
259: """return coyprights"""
260: return self.copyrights
261:
262: manage_options = Folder.manage_options+(
263: {'label':'Main Config','action':'ECHO_copyright_configForm'},
264: )
265:
266:
267: def ECHO_copyright_configForm(self):
268: """change form"""
269: pt=zptFile(self, 'zpt/ChangeECHO_copyright')
270: pt.content_type="text/html"
271: return pt()
272:
273: def ECHO_copyright_config(self,title,RESPONSE=None):
274: """change"""
275: self.title=title
276: self.copyrights=[]
277: self.copyrights=getCopyrightsFromForm(self,self.REQUEST.form)[0:]
1.98 dwinter 278:
1.236 dwinter 279: if RESPONSE is not None:
280: RESPONSE.redirect('manage_main')
281:
282:
1.98 dwinter 283: def manage_addECHO_copyrightForm(self):
284: """Form for adding"""
1.195 casties 285: pt=zptFile(self, 'zpt/AddECHO_copyright.zpt')
1.98 dwinter 286: return pt()
1.1 casties 287:
1.98 dwinter 288: def manage_addECHO_copyright(self, id,title,RESPONSE=None):
1.236 dwinter 289: """add the copyright"""
290:
291: meta_type="ECHO_copyright"
292:
293: #first generate copyrights as list of tripels (mediaType,partner,copyrightType)
294:
295:
1.1 casties 296:
1.236 dwinter 297: self._setObject(id, ECHO_copyright(id, title,getCopyrightsFromForm(self,self.REQUEST.form)))
298:
299: if RESPONSE is not None:
300: RESPONSE.redirect('manage_main')
301:
1.189 dwinter 302: class ECHO_layoutTemplate(ZopePageTemplate,ECHO_basis):
1.29 dwinter 303: """Create a layout Template for different purposes"""
304:
305: meta_type="ECHO_layoutTemplate"
306:
307: def __init__(self, id, text=None, content_type=None,EchoType=None):
308: self.id = str(id)
309:
310: self.ZBindings_edit(self._default_bindings)
311: if text is None:
1.212 dwinter 312: self._default_content_fn = os.path.join(package_home(globals()),'zpt','ECHO_%s_template_standard.zpt'%EchoType)
1.29 dwinter 313: text = open(self._default_content_fn).read()
1.290 casties 314: if content_type is None:
315: content_type = self.content_type
1.29 dwinter 316: self.pt_edit(text, content_type)
317:
318:
319: def manage_addECHO_layoutTemplateForm(self):
320: """Form for adding"""
1.195 casties 321: pt=zptFile(self, 'zpt/AddECHO_layoutTemplate.zpt')
1.29 dwinter 322: return pt()
323:
324:
325: def manage_addECHO_layoutTemplate(self, EchoType,title=None,REQUEST=None):
326: "Add a Page Template with optional file content."
327: if type(EchoType)==StringType:
328: EchoTypes=[EchoType]
329: else:
330: EchoTypes=EchoType
331:
332: for singleType in EchoTypes:
1.32 dwinter 333:
1.29 dwinter 334: id = str(singleType)+"_template"
335: if REQUEST is None:
336: self._setObject(id, ECHO_layoutTemplate(id, text,EchoType=singleType))
337: ob = getattr(self, id)
338:
339: if title:
340: ob.pt_setTitle(title)
341: return ob
342: else:
343: file = REQUEST.form.get('file')
344: headers = getattr(file, 'headers', None)
345: if headers is None or not file.filename:
346: zpt = ECHO_layoutTemplate(id,EchoType=singleType)
347: else:
348: zpt = ECHO_layoutTemplate(id, file, headers.get('content_type'))
349:
350: self._setObject(id, zpt)
351: ob = getattr(self, id)
352: if title:
353: ob.pt_setTitle(title)
354:
355: try:
356: u = self.DestinationURL()
357: except AttributeError:
358: u = REQUEST['URL1']
359:
360:
361: REQUEST.RESPONSE.redirect(u+'/manage_main')
362: return ''
1.1 casties 363:
1.190 dwinter 364: class ECHO_fullText(ZopePageTemplate,ECHO_basis,ECHO_language):
1.236 dwinter 365: """echo fulltext in xml"""
1.163 dwinter 366:
1.236 dwinter 367: meta_type="ECHO_fullText"
1.163 dwinter 368:
1.236 dwinter 369:
370: def getPage(self,nr='1'):
371: """get page n"""
372: #return self().encode('latin-1','ignore')
1.286 dwinter 373: try:
1.279 dwinter 374: dom=xml.dom.minidom.parseString(self())
375: except:
376: dom=xml.dom.minidom.parseString(self().encode('latin-1'))
1.236 dwinter 377: pages=dom.getElementsByTagName('page')
378:
379: return pages[int(nr)-1].toxml()
380:
1.163 dwinter 381: # Product registration and Add support
382: manage_addECHO_fullTextForm = PageTemplateFile(
383: 'zpt/AddECHO_fullText.zpt', globals())
384:
385: def manage_addECHO_fullText(self, id, title=None, text=None,
386: REQUEST=None, submit=None):
387: "Add a Page Template with optional file content."
388:
389: id = str(id)
390: if REQUEST is None:
391: self._setObject(id, ECHO_fullText(id, text))
392: ob = getattr(self, id)
393: if title:
394: ob.pt_setTitle(title)
395: return ob
396: else:
397: file = REQUEST.form.get('file')
398: headers = getattr(file, 'headers', None)
399: if headers is None or not file.filename:
400: zpt = ECHO_fullText(id)
401: else:
402: zpt = ECHO_fullText(id, file, headers.get('content_type'))
403:
404: self._setObject(id, zpt)
405:
406: try:
407: u = self.DestinationURL()
408: except AttributeError:
409: u = REQUEST['URL1']
410:
411: if submit == " Add and Edit ":
1.195 casties 412: u = "%s/%s" % (u, urllib.quote(id))
1.163 dwinter 413: REQUEST.RESPONSE.redirect(u+'/manage_main')
414: return ''
1.142 dwinter 415:
1.192 dwinter 416:
1.236 dwinter 417: class ECHO_resource(CatalogAware,Folder,Persistent,ECHO_basis):
1.1 casties 418: """ECHO Ressource"""
1.123 dwinter 419: security=ClassSecurityInfo()
1.1 casties 420: meta_type='ECHO_resource'
1.236 dwinter 421: default_catalog='resourceCatalog'
422:
423: # viewClassificationList=viewClassificationListMaster
1.1 casties 424:
1.236 dwinter 425: def PrincipiaSearchSource(self):
426: """Return cataloguable key for ourselves."""
427: return str(self)
1.1 casties 428:
1.41 dwinter 429: getSubCols = ECHO_helpers.getSubCols
1.98 dwinter 430:
1.236 dwinter 431: def reindex(self):
432: """generate fields for indexing and reindex"""
1.258 dwinter 433:
1.236 dwinter 434: #TODO: korrigieren des metalink pfades konfigurierbar machen
435: splitted= [x for x in urlparse.urlparse(self.metalink)]
436: splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
437:
438: if splitted[0]=="http":
439: self.metalink=urlparse.urlunparse(splitted)
440:
441:
442: self.fullTextUrl=self.getFullTextXML(noredirect="yes")
443:
444: #TODO: korrigieren relative url to absoluter url volltexten, konfigurierbar?
445: splitted= [x for x in urlparse.urlparse(self.fullTextUrl)]
446: if splitted[0]=="":
447: splitted[0]="http"
448: splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
449:
450: self.fullTextUrl=urlparse.urlunparse(splitted)
451:
452: self.imagePath=self.getImagePath()
453:
454: self.reindex_object()
455:
1.192 dwinter 456:
457: security.declareProtected('View','createPDF')
458: def createPDF(self,RESPONSE=None,local=None,dpi=150):
1.236 dwinter 459: """erzeuge pdf file"""
460: pages=1
461: dpi=float(dpi)
462: imagePath=self.getImagePath().replace("/mpiwg/online","")
463:
464:
465: image="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler?fn="+imagePath+"&dw=%i&dh=%i&pn=%i"
466: xmlInfo="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/dlInfo-xml.jsp?fn="+imagePath
467:
468: dom=xml.dom.minidom.parse(urllib.urlopen(xmlInfo))
469: for parameter in dom.getElementsByTagName('parameter'):
470: if parameter.getAttribute('name')=="pt":
471: pages=int(parameter.getAttribute('value'))
472: break
473:
474:
475: tempdir="/tmp/archivesImageServer"
476: if not os.path.exists(tempdir):
477: os.mkdir(tempdir)
1.193 dwinter 478:
1.236 dwinter 479: tmpPath=tempfile.mkdtemp(dir=tempdir)
480:
1.192 dwinter 481:
1.236 dwinter 482: tmpZip=tempfile.mktemp(dir=tempdir)
1.193 dwinter 483:
1.236 dwinter 484: tmpFn=os.path.split(tmpZip)[1]
1.192 dwinter 485:
486:
1.194 dwinter 487:
1.192 dwinter 488:
1.236 dwinter 489: if RESPONSE:
490: RESPONSE.setHeader("Content-Type","text/html")
491: RESPONSE.write("<h1>I am creating the pdf</h1>")
492: txt="<h3>1. step: getting the images( %i pages)</h3>"%pages
493: RESPONSE.write(txt)
1.192 dwinter 494:
1.236 dwinter 495: c=canvas.Canvas(tmpZip)
496: for i in range(1,pages+1):
497: if RESPONSE:
498: RESPONSE.write(str("<p>Get Page: %i<br>\n"%i))
499: faktor=dpi/72.0
500:
501: fn=tmpPath+"/%i"%i
1.192 dwinter 502:
1.236 dwinter 503: width,height=A4
504: #print image%(width*faktor,height*faktor,i)
505: url=urllib.urlopen(image%(width*faktor,height*faktor,i)).read()
506: fh=file(fn,"w")
507: fh.write(url)
508: fh.close()
1.192 dwinter 509:
510:
511:
1.236 dwinter 512: c.drawImage(fn,0,0,width=width,height=height)
513: c.showPage()
514: c.save()
515: if RESPONSE:
516: RESPONSE.write("<p>finished<br>\n")
517:
518: if RESPONSE:
519: len=os.stat(tmpZip)[6]
520: downloadUrl=self.absolute_url()+"/downloadPDF"
521: RESPONSE.write("""<h1><a href="downloadPDF?fn=%s">Click here for download ( %i Byte)</a></h1>\n"""%(tmpFn,len))
522: RESPONSE.write("""<p>The file will be stored for a while, you can download it later, the URL is:</p>
523: <p><a href="downloadPDF?fn=%s">%s?fn=%s</a></h1>\n"""%(tmpFn,downloadUrl,tmpFn))
524: RESPONSE.close()
1.192 dwinter 525:
526:
527: def downloadPDF(self,fn):
1.236 dwinter 528: """download prepared set"""
529: filename="/tmp/archivesImageServer/"+fn
530: namePDF=self.getId()+".pdf"
531: self.REQUEST.RESPONSE.setHeader("Content-Disposition","""attachement; filename="%s" """%namePDF)
532: self.REQUEST.RESPONSE.setHeader("Content-Type","application/octet-stream")
533: len=os.stat(filename)[6]
534: self.REQUEST.RESPONSE.setHeader("Content-Length",len)
535: images=file(filename).read()
536: self.REQUEST.RESPONSE.write(images)
537: self.REQUEST.RESPONSE.close()
1.192 dwinter 538:
539:
1.143 dwinter 540: def getRDF(self,urn=None):
1.236 dwinter 541: """rdf"""
542: ret=getRDFDescription(self,self.link,urn=urn)
543: return ret+self.createSubElementRDF(urn=urn)
1.146 dwinter 544:
1.190 dwinter 545:
1.258 dwinter 546: def changeAccessRightForm(self,preselect=None):
547: """change the access rights"""
548:
549: pt=zptFile(self, 'zpt/ChangeECHO_resourceAccessRight.zpt')
550: return pt(preselect=preselect)
551:
552: def changeAccessRight(self):
553: """changeRights"""
554: argv=self.REQUEST.form
555: self.setAccessRightXML(argv["%s_xml"%self.getId()])
556: self.accessRight=argv["%s_echo"%self.getId()]
557:
558: self.REQUEST.RESPONSE.redirect('manage_main')
559:
560:
561: def getAccessRightSelectorHTML(self,outlook="select",xmldominant=None,preselect=None):
562: """htmlselector, xmldominant= in der regel wird der wert des xmlfiles ausgegeben ausser er existiert nicht"""
563: values=['','free','MPIWG']
1.236 dwinter 564:
1.258 dwinter 565: if preselect:#set all to the preselected
566: ar=(preselect,preselect)
567: else:#else set to actual value
568: ar=self.getAccessRightMD()
569:
1.236 dwinter 570: if outlook=="select":
1.258 dwinter 571: ret="""<select name="%s_xml">"""%self.getId()
572: ret1="""<select name="%s_echo">"""%self.getId()
1.236 dwinter 573: for value in values:
1.258 dwinter 574: if value==ar[0]:
1.236 dwinter 575: ret+="<option selected>%s</option>"%value
576: else:
577: ret+="<option>%s</option>"%value
1.258 dwinter 578:
579: if value==ar[1]:
580: ret1+="<option selected>%s</option>"%value
581: else:
582: ret1+="<option>%s</option>"%value
583:
584:
585: if not xmldominant:
586: return ret+"</select>",ret1+"</select>"
587: else:
588: if ar[0] is not None:
589: return ret+"</select>"
590: else:
591: return "<p>No xml file (only local selection):"+ret1
1.236 dwinter 592:
593: else:
594: ret=""
1.258 dwinter 595: ret1=""
1.236 dwinter 596: for value in values:
597:
1.258 dwinter 598: if value==ar[0]:
599: ret+="""<input type="radio" name="%s_xml" value="%s" checked>%s"""%(self.getId(),value,value)
1.236 dwinter 600: else:
1.258 dwinter 601: ret+="""<input type="radio" name="%s_xml" value="%s">%s"""%(self.getId(),value,value)
602:
603: if value==ar[1]:
604: ret1+="""<input type="radio" name="%s_echo" value="%s" checked>%s"""%(self.getId(),value,value)
605: else:
606: ret1+="""<input type="radio" name="%s_echo" value="%s">%s"""%(self.getId(),value,value)
607:
608: if not xmldominant:
609: return ret,ret1
610: else:
611: if ar[0]:
612: return ret
613: else:
614: return "<p>No xml file (only local selection)</p>"+ret1
615:
1.132 dwinter 616:
617:
1.258 dwinter 618: def copyAccessRightsFromMD(self):
619: """kopiere rechte aus den metadaten"""
620: self.accessRight=self.getAccessRightMD()[0]
621:
622:
623:
624:
1.132 dwinter 625:
626: def getAccessRightMD(self):
1.236 dwinter 627: """set accessright"""
628: url=self.metalink
629:
630: try:
1.258 dwinter 631: urllib.urlopen(url)
1.236 dwinter 632: except:
1.284 dwinter 633: logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
1.236 dwinter 634:
1.258 dwinter 635: return None,getattr(self,'accessRight','')
636:
637:
1.236 dwinter 638: try:
1.258 dwinter 639: dom = NonvalidatingReader.parseUri(url)
1.236 dwinter 640: except:
1.284 dwinter 641: logger("ECHO_Resource (getAccessRightMD)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
1.258 dwinter 642: return (None,"Cannot parse: "+url+"<br>"+"%s (%s)"%sys.exc_info()[0:2])
1.132 dwinter 643:
644:
1.258 dwinter 645: accessright=dom.xpath("//meta/access-conditions/access/@type")
646: if accessright:
647: accessright=accessright[0].value
648: if str(accessright)=='institution':
649: tmp=dom.xpath("//meta/access-conditions/access/name")
650: if tmp:
651: accessright=getTextFromNode(tmp[0])
652:
653: if not accessright:
654: accessright=""
655:
656: return accessright,getattr(self,'accessRight','')
1.132 dwinter 657:
658: def changeAccessRightMD(self,accessright,RESPONSE=None):
1.258 dwinter 659: """change the rights - not user anymore"""
660: #TODO: check if method still needed
1.236 dwinter 661: params="accessright=%s"%accessright
1.132 dwinter 662:
663:
1.236 dwinter 664: #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()
1.132 dwinter 665:
1.273 dwinter 666: tries=0
667: for i in range(10):
668: x=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()+'/setAccessRightXML'+urllib.quote('?'+params))).read()
669: if x=="ok":
670:
671: break;
672:
1.236 dwinter 673:
674:
675: if RESPONSE is not None:
676: RESPONSE.redirect('manage_main')
1.132 dwinter 677:
1.236 dwinter 678:
1.132 dwinter 679: def setAccessRightXML(self,accessright):
1.236 dwinter 680: """set accessright"""
681: url=self.metalink
1.258 dwinter 682: accessrights=['MPIWG','free']#allowes rights
683:
684: if accessright =='':
685: """do nothing"""
686: return ""
687:
688:
1.236 dwinter 689: try:
690: geturl=""
691: for line in ECHO_helpers.urlopen(url).readlines():
692: geturl=geturl+line
693:
694:
695: except:
696: return (None,"Cannot open: "+url)
697:
698: try:
699: dom=xml.dom.minidom.parseString(geturl)
700: root=dom.getElementsByTagName('resource')[0]
701: except:
702: return (None,"Cannot parse: "+url+"<br>"+geturl)
703:
1.258 dwinter 704: metamains=dom.getElementsByTagName('meta')
705:
706: if not metamains:
707: nodenew=dom.createElement('meta')
708: root.appendChild(nodenew)
709: metamain=nodenew
710: else:
711: metamain=metamains[0]
712:
713:
714: metanodes=metamain.getElementsByTagName('access-conditions')
1.132 dwinter 715:
1.236 dwinter 716: if not metanodes:
717: nodenew=dom.createElement('access-conditions')
1.258 dwinter 718: metamain.appendChild(nodenew)
1.236 dwinter 719: metanode=nodenew
720: else:
721: metanode=metanodes[0]
722:
723: accesses=metanode.getElementsByTagName('access')
724:
1.258 dwinter 725: #delete old
726: if accesses:
727: metanode.removeChild(accesses[0]).unlink()
1.236 dwinter 728:
1.258 dwinter 729: #create new
730:
731: nodenew2=dom.createElement('access')
732: metanode.appendChild(nodenew2)
733: metanode2=nodenew2
734:
735: attribute=metanode2.getAttribute('type')
736:
737: if accessright=="free":
738:
739: metanode2.setAttribute('type','free')
1.236 dwinter 740:
1.258 dwinter 741: elif accessright.upper()=='MPIWG':
742: metanode2.setAttribute('type','institution')
743: nodenew4=dom.createElement('name')
744: metanodetext=dom.createTextNode('MPIWG')
1.236 dwinter 745: nodenew4.appendChild(metanodetext)
1.258 dwinter 746: nodenew2.appendChild(nodenew4)
747: #print dom.toxml().encode('utf-8')
748: string= encodeRPC(dom.toxml().encode('utf-8'))
749:
750: #TODO: make server configurable
751: server=xmlrpclib.Server("http://foxridge.mpiwg-berlin.mpg.de/server")
1.132 dwinter 752:
1.258 dwinter 753: path=urlparse.urlparse(self.metalink)[2]
754:
755: server.writeMetaDataFile(path,string,"yes")
756:
1.125 dwinter 757: def setStartPageForm(self):
1.236 dwinter 758: """Form for changing the startpage"""
1.125 dwinter 759:
1.236 dwinter 760:
761: pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPage.zpt')
1.125 dwinter 762: pt.content_type="text/html"
763: return pt()
764:
1.182 dwinter 765:
766: def createImageUrl(self,pn=1):
1.236 dwinter 767: """create ImageUrl"""
1.184 dwinter 768:
1.236 dwinter 769:
770: resourcepath=readFieldFromXML(self.metalink,'resource','archive-path')
771:
772: digiliburlprefix=readFieldFromXML(self.metalink,'texttool','digiliburlprefix')
773: images=readFieldFromXML(self.metalink,'texttool','image')
1.184 dwinter 774:
775:
1.236 dwinter 776: if (not resourcepath) or (not digiliburlprefix) or (not images):
1.284 dwinter 777: logger("ECHO (createImageUrl)",logging.ERROR,"Cannot create ImageUrl for %s"%self.absolute_url())
1.236 dwinter 778: return None
779: resourcepath=resourcepath.replace('/mpiwg/online','')
780: if not digiliburlprefix: digiliburlprefix="http://echo.mpiwg-berlin.mpg.de/zogilib?"
1.182 dwinter 781:
1.236 dwinter 782: if (not images) or (not resourcepath): return None
1.182 dwinter 783:
1.236 dwinter 784: return "%sfn=%s&pn=%i"%(digiliburlprefix,resourcepath+"/"+images,pn)
1.182 dwinter 785:
1.183 dwinter 786: def copyTitleToInfoXML(self,RESPONSE=None):
1.236 dwinter 787: """copy title from the resource"""
788: presentationXML=readFieldFromXML(self.metalink,'texttool','presentation')
789: resourcepath=readFieldFromXML(self.metalink,'resource','archive-path')
790: if (not presentationXML) or (not resourcepath):
791: if RESPONSE:
792: RESPONSE.write("Error: %s\n"%self.getId())
793: else:
794: return None,self.absolute_url()
795:
796: try:
797: fh=file(os.path.join(resourcepath,presentationXML),'w')
798: fh.write("""<info>
799: <author></author>
800: <title>%s</title>
801: <date></date>
802: <display>yes</display>
803: </info>"""%self.title)
804: fh.close()
805: return 1,self.getId()
806: except:
807: if RESPONSE:
808: RESPONSE.write("Error: %s\n"%self.getId())
809: else:
810: return None,self.absolute_url()
1.183 dwinter 811:
1.236 dwinter 812:
1.124 dwinter 813: def setStartPage(self,startpage=None,RESPONSE=None):
1.236 dwinter 814: """set start page, if no startpage defined use the generic one of the resource"""
1.124 dwinter 815:
1.236 dwinter 816: if (not (type(startpage)==StringType)):
817: if ("__generic" in startpage): # checke ob generic in der liste
818: startpage=self.absolute_url()+"/startpage_html"
819: elif ("__firstPage" in startpage): # checke ob generic in der liste
820: startpage=self.createImageUrl()
821:
822: if (not startpage):
823: startpage=self.absolute_url()+"/startpage_html"
824: elif (startpage=="__generic"):
825: startpage=self.absolute_url()+"/startpage_html"
826: elif (startpage=="__firstPage"):
827: startpage=self.createImageUrl()
828:
829: params="startpage=%s"%startpage
830: #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))
1.273 dwinter 831:
832: tries=0
833: for i in range(10):
834: x=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()
835: if x=="ok":
836:
837: break;
838:
1.236 dwinter 839:
840: path=self.metalink
841:
842: path=re.sub(self.REQUEST['SERVER_URL'],'',path)
843: path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path)
844:
845: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server
846: path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server
847: path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server
1.156 dwinter 848: path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server
1.236 dwinter 849: path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server
850: path=re.sub('http://vision.mpiwg-berlin.mpg.de','',path) # falls vision als server
851: path=re.sub('http://xserve02.mpiwg-berlin.mpg.de:18880','',path) # falls vision als server
852: path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo
853: path=re.sub('/index.meta','',path)
1.124 dwinter 854:
855:
1.236 dwinter 856: ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
1.124 dwinter 857:
1.236 dwinter 858: if RESPONSE is not None:
859: RESPONSE.redirect('manage_main')
1.124 dwinter 860:
1.123 dwinter 861: def changeViewerTemplateSetForm(self):
1.236 dwinter 862: """change the viewer template set"""
863: pt=zptFile(self, 'zpt/changeResourceViewerTemplateSet')
1.123 dwinter 864: return pt()
865:
866:
1.271 casties 867: def setLink(self, link=None):
868: """change link field"""
1.269 casties 869: if link is not None:
1.271 casties 870: self.link = link
1.269 casties 871:
1.182 dwinter 872:
1.123 dwinter 873: def getTextToolsField(self,name,default=''):
874: """Lese Textoolsfelder aus index.meta im path aus"""
875:
876: try:
877: dom=xml.dom.minidom.parse(self.metalink)
878: node=dom.getElementsByTagName('texttool')[0] #getNode
879: subnode=node.getElementsByTagName(name)[0]
880:
881: # bei text wird nur der Folder gebraucht
882: if name=="text":
883: splitted=getText(subnode.childNodes).split("/")
884: return splitted[len(splitted)-2]
885: else:
886: return getText(subnode.childNodes)
887: except:
888: return default
889:
890:
1.154 dwinter 891: def changeViewerTemplateSet(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None):
1.236 dwinter 892: """changeit"""
1.123 dwinter 893:
1.236 dwinter 894: paramList=['project','startpage','xslt','thumbtemplate','topbar','digiLibTemplate','digiliburlprefix']
1.123 dwinter 895:
1.236 dwinter 896:
897: #writeMetadata(self.metalink,self.metaDataHash,project,None,xslt,thumbtemplate,topbar,digiLibTemplate)
1.123 dwinter 898:
1.236 dwinter 899: params="project=%s&xslt=%s&thumbtemplate=%s&topbar=%s&digiLibTemplate=%s&digiliburlprefix=%s"%(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix)
1.124 dwinter 900:
1.273 dwinter 901: try:
902: tries=0
903: for i in range(10):
904: x=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()
905: if x=="ok":
906:
907: break;
908:
909: except:
1.284 dwinter 910: logger("ECHO_ressource (changeViewerTemplateSet)", logging.ERROR,"%s (%s)"%sys.exc_info()[0:2])
911: logger("ECHO_ressource (changeViewerTemplateSet)", logging.ERROR,'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)))
1.236 dwinter 912: #print self.absolute_url()+'/newMetaXML'+urllib.quote'?'+params)
913: # hack Pfad auf die Dokumente
914: path=self.metalink
915:
916:
1.123 dwinter 917:
1.236 dwinter 918: path=re.sub('/index.meta','',path)
1.123 dwinter 919:
1.273 dwinter 920: #TODO: direct access to the file system necessary, fix that also xmlrpc to the server where the index file is stored is possible
921: parsedUrl=urlparse.urlparse(path)
922: path=parsedUrl[2]
923:
924: try:
925: return ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines()
926: except:
1.284 dwinter 927: logger("ECHO_Resource (changeViewerTemplateSet)", logging.INFO,"%s (%s)"%sys.exc_info()[0:2])
928: logger("ECHO_Resource (changeViewerTemplateSet)", logging.INFO,"http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path)
1.123 dwinter 929:
1.236 dwinter 930: if RESPONSE is not None:
931: RESPONSE.redirect('manage_main')
1.123 dwinter 932:
1.98 dwinter 933:
1.189 dwinter 934:
1.236 dwinter 935: security.declarePublic('content_html')
1.29 dwinter 936: def content_html(self):
937: """template fuer content"""
1.189 dwinter 938: return ECHO_basis.content_html(self,'resource')
1.29 dwinter 939:
1.202 casties 940: # def getViewClassification(self):
941: # if hasattr(self,'viewClassification'):
942: # return self.viewClassification
943: # else:
944: # return ""
1.83 dwinter 945:
946: def getFullTextXML(self,noredirect=None):
1.236 dwinter 947: """getFullTextXML; gives the FullText as an XML Document, and <error></error> if somthing goes wrong."""
1.180 dwinter 948:
1.236 dwinter 949: try:
1.284 dwinter 950: #logger("ECHO Fulltext",logging.INFO,"open %s"%self.metalink)
1.236 dwinter 951: fh=ECHO_helpers.urlopen(self.metalink)
1.284 dwinter 952: #logger("ECHO Fulltext",logging.INFO,"opened %s"%self.metalink)
1.236 dwinter 953: dom=xml.dom.minidom.parse(fh)
954: texttools=dom.getElementsByTagName('texttool')
955: text=texttools[0].getElementsByTagName('text')
956: texturl=getText(text[0].childNodes)
1.180 dwinter 957:
1.284 dwinter 958: #logger("ECHO Fulltext",logging.INFO,"found %s"%texturl)
1.179 dwinter 959: fh.close()
1.284 dwinter 960: #logger("ECHO Fulltext",logging.INFO,"closed fh")
1.236 dwinter 961: #keine url
962: if not (texturl.split(":")[0] in ['http','ftp','file']):
963: if not noredirect:
964: return file(texturl).read()
1.181 dwinter 965: else:
1.236 dwinter 966: return texturl
1.180 dwinter 967:
1.236 dwinter 968: if not noredirect:
969: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1.284 dwinter 970: logger("ECHO Fulltext",logging.INFO,"redirect to:%s"%texturl)
1.236 dwinter 971: self.REQUEST.RESPONSE.redirect(texturl)
972: else:
973: return texturl
974: except:
975:
976: if not noredirect:
977: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
978: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
979: else:
980: return "<error>no fulltext available</error>"
1.92 dwinter 981:
1.192 dwinter 982: def getImagePath(self):
1.236 dwinter 983: """gibt pfad zum image aus"""
984: return self.getImageView(noredirect="yes",onlyPath="yes")
1.192 dwinter 985:
986: def getImageView(self,noredirect=None,onlyPath=None):
1.236 dwinter 987: """getImages; give Imageviewr and <error></error> if somthing goes wrong."""
988: try:
989: fh=ECHO_helpers.urlopen(self.metalink)
990: dom=xml.dom.minidom.parse(fh)
991: texttools=dom.getElementsByTagName('texttool')
992: text=texttools[0].getElementsByTagName('image')
993: imagetemp=getText(text[0].childNodes)
994:
995: text=dom.getElementsByTagName('archive-path')
996: archivepath=getText(text[0].childNodes)
997: archivepath=re.sub('/mpiwg/online/','',archivepath)
998: imageurl="http://echo.mpiwg-berlin.mpg.de/zogilib?fn="+archivepath+"/"+imagetemp
999: fh.close()
1000:
1001: if not noredirect:
1002: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1003: self.REQUEST.RESPONSE.redirect(imageurl)
1004: else:
1005: if not onlyPath:
1006: return imageurl
1007: else:
1008: return archivepath+"/"+imagetemp
1009: except:
1010:
1011: if not noredirect:
1012: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1013: self.REQUEST.RESPONSE.write("<error>no fulltext available</error>")
1014: else:
1015: return "<error>no images available</error>"
1.147 dwinter 1016:
1017:
1.104 dwinter 1018: def getCopyrightsHTML(self):
1.236 dwinter 1019: """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus"""
1020:
1021: if hasattr(self,'copyrightModel'):
1022: obj=self.copyrightModel
1023:
1024: else:
1025: return "ERROR"
1026: ret=[]
1027:
1028: for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID
1029:
1030:
1031: try:
1032: if hasattr(self.copyrightTypes,copyright[2]):
1033: copyrightTypeObj=getattr(self.copyrightTypes,copyright[2])
1034: link="copyrightTypes/"+copyright[2]+'/copyright.html'
1035: else:
1036: copyrightTypeObj=getattr(obj,copyright[2])
1037: link="copyrightModel/"+copyright[2]+'/copyright.html'
1038:
1039: label=copyrightTypeObj.label
1040: url=getattr(copyrightTypeObj, 'url', '')
1041:
1042: if url!='':
1043: ret.append((url,copyright[0],copyright[1],copyright[2],label))
1044: else:
1045: if hasattr(copyrightTypeObj, 'copyright.html'):
1046: ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label))
1047: else:
1048: ret.append(('empty',copyright[0],copyright[1],copyright[2],label))
1049: except:
1050: """nothing"""
1051:
1052: return ret
1053:
1.157 jdamerow 1054: def getInstitutionsHTML(self):
1.236 dwinter 1055: """gibt Liste der foerdernden Institutionen aus"""
1056:
1057: if hasattr(self,'support'):
1058: obj=self.support
1059: ret=obj.getSupporter()
1060: return ret
1061: else:
1062: return ''
1063:
1.272 dwinter 1064: def getOwnerOriginalsHTML(self):
1065: """gibt Liste der foerdernden Institutionen aus"""
1066:
1067: if hasattr(self,'ownerOriginal'):
1068: obj=self.ownerOriginal
1069: ret=obj.getOwner()
1070: return ret
1071: else:
1072: return ''
1073:
1074: def getDigiCopyByHTML(self):
1075: """gibt Liste der foerdernden Institutionen aus"""
1076:
1077: if hasattr(self,'digiCopyBy'):
1078: obj=self.digiCopyBy
1079: ret=obj.getDigiCopyBy()
1080: return ret
1081: else:
1082: return ''
1.83 dwinter 1083:
1.9 dwinter 1084: def getCredits(self):
1085: """Ausgabe der credits"""
1086: if self.credits:
1087: return self.credits
1088: else:
1089: return []
1.195 casties 1090:
1091:
1.6 dwinter 1092:
1.94 dwinter 1093: def __init__(self,id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords):
1.1 casties 1094:
1095: self.id = id
1096: """Festlegen der ID"""
1097:
1098: self.label = label
1099: self.link= link
1100: self.metalink=metalink
1101: self.title=title
1102: self.weight=weight
1103: self.credits=toList(credits)
1104: self.description=description
1.27 dwinter 1105: self.contentType=contentType
1.236 dwinter 1106: self.copyrightType=copyrightType
1107: self.renderingType=renderingType
1.1 casties 1108: self.responsible=responsible
1.90 dwinter 1109: self.resourceID=resourceID
1.236 dwinter 1110:
1.9 dwinter 1111: if coords:
1112: coordsnew=[ string.split(x,",") for x in coords]
1113: else:
1114: coordsnew=[]
1115:
1.1 casties 1116: self.coords=coordsnew
1.236 dwinter 1117: # self.viewClassification=""
1.1 casties 1118:
1.3 dwinter 1119:
1120:
1.49 dwinter 1121: def getContentType(self):
1.236 dwinter 1122: try:
1.277 dwinter 1123: return normalizeCt(self.contentType)
1.236 dwinter 1124: except:
1125: return ""
1.1 casties 1126:
1.73 dwinter 1127: def getCopyrightType(self):
1.236 dwinter 1128: try:
1129: return self.copyrightType
1130: except:
1131: return ""
1.73 dwinter 1132:
1133: def getRenderingType(self):
1.236 dwinter 1134: try:
1135: return self.renderingType
1136: except:
1137: return ""
1.73 dwinter 1138:
1.1 casties 1139: def ECHO_resource_config(self):
1140: """Main configuration"""
1141:
1142: if not hasattr(self,'weight'):
1143: self.weight=""
1144:
1.195 casties 1145: pt=zptFile(self, 'zpt/ChangeECHO_resource.zpt')
1.1 casties 1146: return pt()
1147:
1148:
1.73 dwinter 1149: def ECHO_resource_config_main(self):
1150: """Main configuration"""
1151: if not hasattr(self,'weight'):
1152: self.weight=""
1.195 casties 1153: pt=zptFile(self, 'zpt/ChangeECHO_resource_main.zpt')
1.73 dwinter 1154: return pt()
1155:
1156: def ECHO_resource_config_coords(self):
1157: """Coords configuration """
1.195 casties 1158: pt=zptFile(self, 'zpt/ChangeECHO_resource_coords.zpt')
1.73 dwinter 1159: return pt()
1160:
1161: def ECHO_resource_config_credits(self):
1162: """Main configuration"""
1.195 casties 1163: pt=zptFile(self, 'zpt/ChangeECHO_resource_credits.zpt')
1.73 dwinter 1164: return pt()
1165:
1166: def ECHO_resource_config_metadata(self):
1167: """Main configuration"""
1.236 dwinter 1168: if (hasattr(self,'metadata')) and not (hasattr(self,'metaDataHash')):
1169: self.metaDataHash={}
1170: self.contentType=self.bib_type
1171: for data in self.metadata:
1172: data_neu=re.sub('-','_',data)
1.243 dwinter 1173: self.metaDataHash[data_neu]=getattr(self,data)[0:]
1.91 dwinter 1174:
1.236 dwinter 1175:
1.195 casties 1176: pt=zptFile(self, 'zpt/ChangeECHO_resource_metadata.zpt')
1.73 dwinter 1177: return pt()
1178:
1179:
1180:
1.280 dwinter 1181: def changeViewer(self,newViewer):
1182: """set newViewer to the url of the new viewer
1183: only if metalink is set, otherwise it gives false
1184: """
1185:
1.287 dwinter 1186: texterUrl="http://nausikaa2.mpiwg-berlin.mpg.de/digitallibrary/servlet/Texter?fn=/"
1187:
1.280 dwinter 1188: vl,msg=self.checkValidityOfMetaLink()
1189:
1.287 dwinter 1190: if not vl: #ungueltiger link, versuche neuen
1191: newStr=re.match(".*/mpiwg/online/(.*)",self.metalink) # suche pfad hinter /mpiwg/online
1192: oldLink=self.metalink
1193:
1194: if newStr:
1195: self.metalink=texterUrl+newStr.group(1)
1196: vl,msg=self.checkValidityOfMetaLink()
1197: else:
1198: logging.error("change Viewer XX(mew Metadatafile) %s"%self.metalink)
1199: vl=False
1200:
1201: if not vl: # geht immer noch nicht, dann setzte wieder zurueck
1202: self.metaLink=oldLink
1203:
1204: logging.info("change Viewer (mew Metadatafile) %s"%self.metalink)
1205:
1.280 dwinter 1206: if vl:
1207: self.newViewer=newViewer
1208: return vl,msg
1209: else:
1210: return vl,msg
1211:
1212: def checkValidityOfMetaLink(self):
1213: """checks if the metalink is valid xml"""
1214:
1215: ml=self.metalink
1216:
1217: try:
1218: txt=urllib.urlopen(ml)
1.73 dwinter 1219:
1.280 dwinter 1220: except:
1221: return False,"Cannot open: %s)"%ml
1222:
1223: txt.close()
1224: try:
1225: dom = NonvalidatingReader.parseUri(ml)
1226: except:
1227: return False, "Connot parse: %s)"%ml
1228:
1229: if len(dom.xpath("//texttool"))==0:
1230: return False, "No texttools: %s)"%ml
1231:
1232: return True,""
1233:
1234: def changeECHO_resource_main(self,metalink,link,title,label,description,contentType,renderingType,weight,resourceID,newViewer='',RESPONSE=None):
1.195 casties 1235: """Aenderung der Properties"""
1.236 dwinter 1236: self.resourceID=resourceID
1237: self.title=title
1238: self.label=label
1239: self.description=description
1240:
1241: self.contentType=contentType
1242: self.renderingType=renderingType
1243: self.weight=weight
1244:
1.73 dwinter 1245: self.link=link
1246: self.metalink=metalink
1247:
1.280 dwinter 1248: self.newViewer=newViewer
1249:
1250:
1.73 dwinter 1251: if RESPONSE is not None:
1252: RESPONSE.redirect('manage_main')
1253:
1254:
1.195 casties 1255: def changeECHO_resource_coords(self,RESPONSE=None):
1256: """Aenderung der Properties - coords"""
1.236 dwinter 1257: #return self.REQUEST
1258: for area in self.getMapAreas():
1259: id = area.getId()
1260: if self.REQUEST.has_key('del.'+id):
1261: # delete this area
1262: self._delObject(id)
1263: # return to same menu
1264: if RESPONSE is not None:
1265: RESPONSE.redirect('ECHO_resource_config_coords')
1266: return
1267: # modify this area
1268: coordstring = self.REQUEST.get('coords.'+id, '')
1269: coords = string.split(coordstring, ',')
1270: angle = self.REQUEST.get('angle.'+id, '0')
1271: type = self.REQUEST.get('type.'+id, 'area')
1272: if len(coords) == 4:
1273: area.setCoordString(coordstring)
1274: area.setAngle(angle)
1275: area.setType(type)
1276: # return to main menu
1277: if RESPONSE is not None:
1278: RESPONSE.redirect('manage_main')
1.73 dwinter 1279:
1280:
1281: def changeECHO_resource_credits(self,credits,responsible,copyrightType,RESPONSE=None):
1.195 casties 1282: """Aenderung der Properties"""
1.236 dwinter 1283: self.credits=credits
1284: self.responsible=responsible
1285: self.copyrightType=copyrightType
1.73 dwinter 1286:
1287: if RESPONSE is not None:
1288: RESPONSE.redirect('manage_main')
1289:
1290:
1.90 dwinter 1291: def changeECHO_resource_metadata_local(self,RESPONSE=None):
1.236 dwinter 1292: """change metadata"""
1.277 dwinter 1293: tags=self.findTagsFromMapping(normalizeCt(self.contentType))
1.236 dwinter 1294: for field in tags[1]:
1295: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)][0:]
1296:
1297:
1298:
1299: if RESPONSE is not None:
1300: RESPONSE.redirect('manage_main')
1.90 dwinter 1301:
1.73 dwinter 1302: def changeECHO_resource_metadata(self,RESPONSE=None):
1.236 dwinter 1303: """change metadata"""
1.277 dwinter 1304: tags=self.findTagsFromMapping(normalizeCt(self.contentType))
1.236 dwinter 1305: self.OSAS_meta={}
1306: for field in tags[1]:
1307: try:
1308: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]
1309: self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]
1310: except:
1.284 dwinter 1311: logger("ECHO_collection (changeECHO_resource_metadata)",logging.ERROR,"%s (%s)"%sys.exc_info()[0:2])
1.73 dwinter 1312:
1.261 dwinter 1313: print self.newMetaXML()
1.273 dwinter 1314: tries=0
1315: for i in range(10):
1316: x=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()
1317: if x=="ok":
1318:
1319: break;
1320:
1321:
1.123 dwinter 1322:
1.236 dwinter 1323: if RESPONSE is not None:
1324: RESPONSE.redirect('manage_main')
1.73 dwinter 1325:
1.248 dwinter 1326:
1327:
1.255 dwinter 1328: def getMDValueSimpleSearchField(self):
1329: """returns value for simple search"""
1.260 dwinter 1330:
1331: try:
1.283 casties 1332: return " ".join([self.getMDValue('title',generic="yes"),
1333: self.getMDValue('author',generic="yes"),
1334: self.getMDValue('year',generic="yes"),self.getTitle()])
1.260 dwinter 1335: except:
1336:
1.284 dwinter 1337: #logger(" ECHO_collection(getMDSimpleSearchField)",logging.INFO," ".join([self.getMDValue('title',generic="yes"),
1.260 dwinter 1338: # self.getMDValue('author',generic="yes"),
1339: # self.getMDValue('year',generic="yes"),'']))
1340: return ""
1.255 dwinter 1341:
1.249 dwinter 1342: def getMDValue(self,fieldNameTest,empty=None,generic=None):
1.245 dwinter 1343: """get md values"""
1344: #TODO: cache mappinghash
1.260 dwinter 1345:
1.249 dwinter 1346: fieldName=None
1.245 dwinter 1347: if generic:
1.255 dwinter 1348: if self.contentType:
1349: ct=self.contentType.replace(" ","_").lower()
1.277 dwinter 1350: ct=self.contentType.replace("-","_").lower()
1.255 dwinter 1351: else:
1.284 dwinter 1352: logger("ECHO_collection (getMDValue)", logging.INFO, "no_content type for %s"%self.getId())
1.255 dwinter 1353: ct=""
1354:
1.245 dwinter 1355: #caching
1356: if not hasattr(self,'_v_mapHash'): #noch keine cachevariable
1357: self._v_mapHash={}
1.286 dwinter 1358:
1.277 dwinter 1359:
1360:
1.245 dwinter 1361: tmp=self._v_mapHash.get(ct,None)
1362: if tmp: #teste ob type schon existiert
1363: fieldName=tmp.get(fieldNameTest,None)
1364: else:
1365: self._v_mapHash[ct]={}
1366:
1.277 dwinter 1367:
1.245 dwinter 1368: #noch nicht gecached
1369: if not fieldName and hasattr(self.standardMD,ct):
1370: fieldName=getattr(self.standardMD,ct).generateMappingHash()[fieldNameTest][0]
1371: self._v_mapHash[ct][fieldNameTest]=fieldName
1.250 dwinter 1372: if not fieldName:
1373: fieldName=fieldNameTest
1.283 casties 1374: if not empty:
1.273 dwinter 1375: #FIXME: warum gibt es manchmal kein metadatahas
1.247 dwinter 1376: try:
1.260 dwinter 1377:
1.277 dwinter 1378: ret =self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%normalizeCt(self.contentType))
1.247 dwinter 1379: except:
1.284 dwinter 1380: logger("ECHO (line 1069)",logging.ERROR,"no md hash for %s"%self.getId())
1.247 dwinter 1381: return ""
1.249 dwinter 1382:
1.236 dwinter 1383: else:
1.283 casties 1384:
1.260 dwinter 1385:
1386: ret= self.metaDataHash.get(fieldNameTest,empty)
1.284 dwinter 1387:
1.260 dwinter 1388: if type(ret) is StringType:
1389: return ret.decode('utf-8')
1390: else:
1391: return ret
1.261 dwinter 1392:
1.248 dwinter 1393: getFieldValue=getMDValue #depricated
1.249 dwinter 1394:
1.154 dwinter 1395: def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,digiliburlprefix=None):
1.236 dwinter 1396: """new index.meta"""
1397: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1.73 dwinter 1398:
1.236 dwinter 1399: if not hasattr(self,'metaDataHash'):
1400:
1401: self.copyIndex_meta2echo_resource()
1402: try:
1.272 dwinter 1403:
1404:
1.236 dwinter 1405: return writeMetadata(self.metalink,self.OSAS_meta,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
1406: except:
1.273 dwinter 1407: #print self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix
1.272 dwinter 1408:
1.236 dwinter 1409: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix)
1.90 dwinter 1410:
1.149 dwinter 1411: def showMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
1.236 dwinter 1412: """return bibliographical metadata as stored in the object"""
1413:
1414: try:
1415:
1416: return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,xmlfrag="yes")
1417: except:
1418: return "<error> no metadata stored</error>"
1419:
1420: def getXQueryMetaData(self,xquery):
1421: '''
1422: execute an xquery on the metadata and returns a list of tuples,
1423: each tuple represent the content of the node as text and the whole node as xml-fragment
1424: @param xquery: xquery auf den metadaten
1425: '''
1426:
1427: try:
1428: md=writeMetadata(self.metalink,self.metaDataHash,xmlfrag="yes")
1429: except:
1430: return None
1431:
1432: dom = NonvalidatingReader.parseString(md,"http://www.mpiwg-berlin.mpg.de/")
1433:
1434: results=Ft.Xml.XPath.Evaluate(xquery, contextNode=dom)
1435:
1436: ret=[]
1437: for result in results:
1438:
1439: buf = cStringIO.StringIO()
1440: PrettyPrint(result, stream=buf)
1441: str = buf.getvalue()[0:]
1442: buf.close()
1443: ret.append((getTextFromNode(result),str))
1444:
1445: return ret
1446:
1.123 dwinter 1447: def getMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None):
1.236 dwinter 1448: """prints out metadata as stored in the echo environment, format is the index.meta format"""
1449: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
1450: return writeMetadata(self.metalink,self.metaDataHash)
1.90 dwinter 1451:
1.202 casties 1452: def changeECHO_resource(self,metalink,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None):
1.195 casties 1453: """Aenderung der Properties"""
1.1 casties 1454:
1.198 casties 1455: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
1.1 casties 1456: self.link=link
1457: self.metalink=metalink
1458:
1459: if RESPONSE is not None:
1460: RESPONSE.redirect('manage_main')
1461:
1462:
1463: manage_options = Folder.manage_options+(
1.73 dwinter 1464: {'label':'Main Config','action':'ECHO_resource_config_main'},
1.236 dwinter 1465: {'label':'Change Metadata','action':'ECHO_resource_config_metadata'},
1466: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
1.73 dwinter 1467: {'label':'Sync Metadata','action':'ECHO_getResourceMD'},
1.236 dwinter 1468: {'label':'Change TemplateSets and Image Viewer','action':'changeViewerTemplateSetForm'},
1469: {'label':'set/change startpage','action':'setStartPageForm'},
1470: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
1.258 dwinter 1471: {'label':'Change AccessRights','action':'changeAccessRightForm'},
1.236 dwinter 1472: )
1.1 casties 1473:
1.73 dwinter 1474:
1475: def isDefinedInThisSet(self,fields,field):
1.236 dwinter 1476: """checks if field is defined in fields"""
1477: if (fields[0].has_key(field)) and not (fields[0][field]==""):
1478: return 1
1479: else:
1480:
1481: return 0
1482:
1.73 dwinter 1483: def getFieldLabel(self,fields,field):
1484: """get labels"""
1485: try:
1486: ret =fields[0][field]
1487: if ret == "":
1488: return field
1489: else:
1490: return ret
1491: except:
1492: return field
1493:
1494:
1495:
1496: def getFieldTag(self,fields,field):
1497: """get labels"""
1498: try:
1499: ret =fields[0][field]
1500: if ret == "":
1501: return field
1502: else:
1503: return ret
1504: except:
1505: return field
1506:
1507:
1508:
1.90 dwinter 1509: def getMetaDataHash(self):
1.236 dwinter 1510: """md hash"""
1511: return self.metaDataHash
1.90 dwinter 1512:
1513: def setFieldValue(self,field,value):
1514: """get value"""
1.245 dwinter 1515: #TODO: remove setFieldValue
1.236 dwinter 1516:
1517: if not hasattr(self,'metaDataHash'):
1518: setattr(self,'metaDataHash',{})
1519: self.metaDataHash[field]=value[0:]
1.90 dwinter 1520:
1.130 dwinter 1521: def copySearchFields(self):
1.236 dwinter 1522: """copys metadatafields to the object"""
1523: fields=['author','title','year']
1.245 dwinter 1524:
1.236 dwinter 1525: for field in fields:
1.245 dwinter 1526: setattr(self,'MD_'+field,self.getMDValue(field,generic="yes"))
1.130 dwinter 1527:
1.90 dwinter 1528:
1.73 dwinter 1529: def findLabelsFromMapping(self,referenceType):
1530: """gib hash mit label -> generic zurueck"""
1.236 dwinter 1531: #return {},[]
1.90 dwinter 1532:
1533: temp=self.ZopeFind(self.standardMD)
1534:
1.236 dwinter 1535: if referenceType=="":
1536: referenceType="book"
1537:
1538:
1.73 dwinter 1539: bibdata={}
1540: retdata={}
1.236 dwinter 1541: fields=[]
1.73 dwinter 1542: fieldlist=self.standardMD.fieldList
1.204 dwinter 1543:
1.277 dwinter 1544: tags=self.findTagsFromMapping(normalizeCt(self.contentType))
1.236 dwinter 1545: self.referencetypes=tags[2]
1546: for referenceTypeF in self.referencetypes:
1.286 dwinter 1547:
1.277 dwinter 1548:
1549: if normalizeCt(referenceTypeF[1].title) == normalizeCt(referenceType.lower()):
1.91 dwinter 1550:
1.236 dwinter 1551: try:
1552: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
1553: referenceType=referenceTypeF[1].title
1554: except:
1555: bibdata[referenceType]=referenceTypeF[1].fields
1556:
1.86 dwinter 1557:
1.236 dwinter 1558: bibdata['data']=referenceTypeF[1]
1559: fields=bibdata[referenceType]
1.73 dwinter 1560: for field in fieldlist:
1561: retdata[field]=referenceTypeF[1].getValue(field)[1]
1.91 dwinter 1562:
1.90 dwinter 1563: return retdata,fieldlist,temp,fields
1.73 dwinter 1564:
1565: def findTagsFromMapping(self,referenceType):
1566: """gib hash mit label -> generic zurueck"""
1.236 dwinter 1567:
1.90 dwinter 1568:
1.236 dwinter 1569: if referenceType=="":
1570: referenceType="book"
1571:
1572: temp = self.ZopeFind(self.standardMD)[0:]
1.90 dwinter 1573:
1.236 dwinter 1574:
1575: #self.referencetypes=temp[0:]
1576:
1577:
1.245 dwinter 1578:
1.90 dwinter 1579:
1.73 dwinter 1580: bibdata={}
1581: retdata={}
1582: fieldlist=self.standardMD.fieldList
1.130 dwinter 1583: fields=[]
1.236 dwinter 1584: for referenceTypeF in temp:
1585: #print referenceType
1586:
1.277 dwinter 1587: if normalizeCt(referenceTypeF[1].title) == normalizeCt(referenceType.lower()):
1.236 dwinter 1588: try:
1589: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields
1590: referenceType=referenceTypeF[1].title
1591: except:
1592: bibdata[referenceType]=referenceTypeF[1].fields
1593: bibdata['data']=referenceTypeF[1]
1594: fields=bibdata[referenceType]
1.73 dwinter 1595: for field in fieldlist:
1596: retdata[field]=referenceTypeF[1].getValue(field)[0]
1.236 dwinter 1597:
1.90 dwinter 1598: return retdata,fieldlist,temp,fields
1.73 dwinter 1599:
1600:
1.123 dwinter 1601: security.declarePublic('copyIndex_meta2echo_resource') # has to be change, presentlyset because of OSAS koordination
1.90 dwinter 1602: def copyIndex_meta2echo_resource(self,RESPONSE=None):
1.236 dwinter 1603: """copy MD von Index_meta to the echo_resource"""
1604:
1605: (metadict, error)=readMetadata(self.metalink)
1606:
1607:
1608:
1609: self.metaDataHash={}
1610: if not error=="": #Fehler beim Auslesen des Metafiles
1611:
1612: return "ERROR:",error,self.absolute_url()
1613:
1.277 dwinter 1614: self.contentType=normalizeCt(metadict['bib_type'])[0:]
1615: fields=self.findTagsFromMapping(normalizeCt(self.contentType))
1.236 dwinter 1616:
1.277 dwinter 1617: #fields=self.findLabelsFromMapping(normalizeCt(self.contentType))
1.236 dwinter 1618: for field in fields[1]:
1619:
1620: if self.isDefinedInThisSet(fields,field):
1621: #print urllib.unquote(metadict.get(self.getFieldTag(fields,field),''))
1622: self.setFieldValue(self.getFieldTag(fields,field),metadict.get(self.getFieldTag(fields,field),''))
1623:
1624:
1625:
1626: if RESPONSE:
1627: return RESPONSE.redirect('manage_main')
1628:
1.277 dwinter 1629: return "OK:",self.absolute_url(),normalizeCt(self.contentType)
1.245 dwinter 1630:
1.250 dwinter 1631: def ECHO_getResourceMD(self,template="yes",back=None,overwrite="no"):
1.1 casties 1632: """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource"""
1633: (metadict, error)=readMetadata(self.metalink)
1.260 dwinter 1634:
1.133 dwinter 1635: if back:
1636: self.REQUEST.SESSION['back']=back
1.1 casties 1637:
1638: if not error=="": #Fehler beim Auslesen des Metafiles
1.236 dwinter 1639: return "ERROR:",error
1.249 dwinter 1640:
1.250 dwinter 1641: if (not self.contentType) or (overwrite=="yes"):
1.277 dwinter 1642: self.contentType=normalizeCt(normalizeCt(metadict['bib_type']).lower())
1.249 dwinter 1643:
1.277 dwinter 1644: if not (normalizeCt(metadict['bib_type']).lower()==normalizeCt(self.contentType).lower()):
1645: self.REQUEST.SESSION['contentStorage']=normalizeCt(metadict['bib_type'])
1646: self.REQUEST.SESSION['contentZope']=normalizeCt(self.contentType)
1.236 dwinter 1647:
1648: return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')()
1649:
1.260 dwinter 1650: #self.REQUEST.SESSION['metadict']=metadict
1.236 dwinter 1651:
1652:
1653:
1.261 dwinter 1654:
1.260 dwinter 1655: self.REQUEST.SESSION['diffs']=checkDiffs(self,metadict)
1.13 dwinter 1656:
1.261 dwinter 1657:
1.1 casties 1658: if template=="yes":
1.260 dwinter 1659: #pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_resourceMD.zpt'),metadict=metadict).__of__(self)
1.236 dwinter 1660: pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt')
1.260 dwinter 1661:
1662: return pt(metadict=metadict)
1.73 dwinter 1663:
1.236 dwinter 1664:
1.73 dwinter 1665:
1666:
1.1 casties 1667:
1668: def ECHO_getMD(self,item):
1669: """Ausgabe der MD"""
1670: return getattr(self,item)
1.191 dwinter 1671:
1672: def checkRDF(self,path):
1.236 dwinter 1673: """check if pdf in the path"""
1674: try:
1675: for fileName in os.listdir(path):
1676: if os.path.splitext(fileName)[1]==".pdf":
1677: return os.path.join(path,fileName)
1678: return None
1679: except:
1680: return None
1681:
1682:
1.224 casties 1683: security.declareProtected('View','index_html')
1.1 casties 1684: def index_html(self):
1685: """standard page"""
1.191 dwinter 1686: pdf=self.checkRDF(self.link)
1.236 dwinter 1687: if pdf:
1688: fh=file(pdf,'r').read()
1689: self.REQUEST.RESPONSE.setHeader('Content-Type','application/pdf')
1690: self.REQUEST.RESPONSE.write(fh)
1691: self.REQUEST.RESPONSE.close()
1692: return
1.280 dwinter 1693:
1694: if getattr(self,'newViewer',''): #benutze den neuen viewer
1695: url=self.newViewer+'url='+self.metalink+"&mode=texttool"
1696: return self.REQUEST.RESPONSE.redirect(url)
1697:
1.1 casties 1698: return self.REQUEST.RESPONSE.redirect(self.link)
1699:
1.90 dwinter 1700: def startpage_html(self):
1.236 dwinter 1701: """prints out a startpage for a resource for use e.g. in the BVE"""
1.90 dwinter 1702:
1.236 dwinter 1703: # suche ob startpage.html in dem Ordner vorhanden ist, dann wir diese angezeigt
1.90 dwinter 1704:
1.236 dwinter 1705: sp=self.ZopeFind(self,obj_ids=['startpage.html'])
1.90 dwinter 1706:
1.236 dwinter 1707: if sp:
1708: return sp[1]()
1.90 dwinter 1709:
1.195 casties 1710: #pruefen ob irgendwo ein template
1.236 dwinter 1711: if hasattr(self,'startpage_index_template'):
1712: return self.startpage_index_template()
1.90 dwinter 1713:
1.236 dwinter 1714: #generisches template ausgeben
1715:
1716: pt=zptFile(self, 'zpt/ECHO_startpage_index_template_standard.zpt')
1717: pt.content_type="text/html"
1718: return pt()
1.90 dwinter 1719:
1720: def toc_html(self):
1.236 dwinter 1721:
1722: sp=self.ZopeFind(self,obj_ids=['toc.html'])
1723:
1724: if sp:
1725: return sp[0][1]()
1.90 dwinter 1726:
1727:
1.123 dwinter 1728: security.declarePublic('generate_label') # has to be change, presentlyset because of OSAS koordination
1.133 dwinter 1729:
1.1 casties 1730: def generate_label(self):
1731: """Erzeugt_standard_Label aus Template"""
1.277 dwinter 1732: pt=getattr(self,"label_template_"+normalizeCt(self.contentType).lower())
1.13 dwinter 1733:
1.236 dwinter 1734: self.label=pt()[0:]
1.1 casties 1735: return pt()
1736:
1.123 dwinter 1737: security.declarePublic('generate_title') # has to be change, presentlyset because of OSAS koordination
1.133 dwinter 1738:
1.90 dwinter 1739: def generate_title(self,RESPONSE=None):
1740: """Erzeugt_standard_Label aus Template"""
1.277 dwinter 1741: pt=getattr(self,"label_template_"+normalizeCt(self.contentType).lower())
1.90 dwinter 1742:
1.236 dwinter 1743: self.title=pt()[0:]
1744:
1.90 dwinter 1745: return pt()
1746:
1.123 dwinter 1747: Globals.InitializeClass(ECHO_resource)
1748:
1.13 dwinter 1749: def manage_addECHO_resourceForm(self):
1750: """Form for adding a ressource"""
1.195 casties 1751: pt=zptFile(self, 'zpt/AddECHO_resourceForm.zpt')
1.1 casties 1752: return pt()
1753:
1754:
1.10 dwinter 1755:
1.207 dwinter 1756: 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):
1.224 casties 1757: """addresource"""
1.1 casties 1758:
1.94 dwinter 1759: newObj=ECHO_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,copyrightType,responsible,credits,weight,coords)
1.1 casties 1760:
1761: self._setObject(id,newObj)
1.13 dwinter 1762:
1.1 casties 1763: if RESPONSE is not None:
1764: RESPONSE.redirect('manage_main')
1765:
1766:
1.189 dwinter 1767: class ECHO_externalLink(Folder,ECHO_basis):
1.1 casties 1768: """Link zu einer externen Ressource"""
1769: security=ClassSecurityInfo()
1770: meta_type='ECHO_externalLink'
1771:
1.210 dwinter 1772: security.declarePublic('content_html')
1.29 dwinter 1773: def content_html(self):
1774: """template fuer content"""
1.251 dwinter 1775: ret= ECHO_basis.content_html(self,'externalLink')
1776:
1.260 dwinter 1777: if type(ret) is StringType:
1778: return ret.decode('utf-8')
1779: else:
1780: return ret
1.252 dwinter 1781:
1.251 dwinter 1782:
1.29 dwinter 1783:
1.283 casties 1784: def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords,linkType):
1.1 casties 1785:
1786: self.id = id
1787: """Festlegen der ID"""
1788:
1789: self.credits=toList(credits)
1790: self.label = label
1791: self.link= link
1792: self.title=title
1793: self.weight=weight
1794: self.description=description
1.27 dwinter 1795: self.contentType=contentType
1.1 casties 1796: self.responsible=responsible
1797: coordsnew=[ string.split(x,",") for x in coords]
1798: self.coords=coordsnew
1.286 dwinter 1799: self.linkType = linkType # Linktypen 'otherPresentation','external'
1800:
1.1 casties 1801:
1802: def ECHO_externalLink_config(self):
1803: """Main configuration"""
1804:
1805: if not hasattr(self,'weight'):
1806: self.weight=""
1807: if not hasattr(self,'coords'):
1.9 dwinter 1808:
1.1 casties 1809: self.coords=['']
1.91 dwinter 1810:
1.1 casties 1811:
1.195 casties 1812: pt=zptFile(self, 'zpt/ChangeECHO_externalLink.zpt')
1.1 casties 1813: return pt()
1814:
1815:
1.283 casties 1816: def changeECHO_externalLink(self,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None,linkType='otherPresentation'):
1.195 casties 1817: """Aenderung der Properties"""
1.198 casties 1818: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
1.1 casties 1819:
1820: self.link=link
1.286 dwinter 1821: self.linkType = linkType
1.1 casties 1822: if RESPONSE is not None:
1823: RESPONSE.redirect('manage_main')
1.286 dwinter 1824:
1.283 casties 1825: def getLinkType(self):
1826: """ return linkType """
1827: if hasattr(self,"linkType"):
1.286 dwinter 1828: return self.linkType
1829: else :
1830: return 'otherPresentation'
1.283 casties 1831:
1832: def setLinkType(self,type):
1833: """ set linkType """
1834: self.linkType = type
1.286 dwinter 1835:
1836: def checkLink(self):
1837: """ returns tuple (isWorking,Error) """
1838: try:
1839: urllib2.urlopen(self.link)
1840: return (True, '')
1841: except urllib2.HTTPError, e:
1842: return (False, e.code)
1843: except urllib2.URLError, e:
1844: return (False, str(e.reason))
1845: except:
1846: return (False, 'unknown Error')
1.1 casties 1847:
1848:
1.285 dwinter 1849: manage_options = (
1.1 casties 1850: {'label':'Main Config','action':'ECHO_externalLink_config'},
1.236 dwinter 1851: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
1.285 dwinter 1852: )+Folder.manage_options
1.17 dwinter 1853:
1854:
1.1 casties 1855: def index_html(self):
1856: """standard page"""
1857:
1858: return self.REQUEST.RESPONSE.redirect(self.link)
1.286 dwinter 1859:
1.1 casties 1860:
1.13 dwinter 1861: def manage_addECHO_externalLinkForm(self):
1862: """Form for external Links"""
1.195 casties 1863: pt=zptFile(self, 'zpt/AddECHO_externalLinkForm.zpt')
1.1 casties 1864: return pt()
1865:
1866:
1.283 casties 1867: def manage_addECHO_externalLink(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None,linkType='otherPresentation'):
1.13 dwinter 1868: """Add an external Link"""
1.1 casties 1869:
1.283 casties 1870: newObj=ECHO_externalLink(id,link,title,label,description,contentType,responsible,credits,weight,coords,linkType)
1.1 casties 1871:
1872: self._setObject(id,newObj)
1.13 dwinter 1873:
1.1 casties 1874: if RESPONSE is not None:
1875: RESPONSE.redirect('manage_main')
1876:
1.24 dwinter 1877:
1.51 dwinter 1878: class ECHO_link(ECHO_externalLink):
1.236 dwinter 1879: """external_link"""
1880:
1881: meta_type="ECHO_link"
1.251 dwinter 1882:
1883: manage_options = ECHO_externalLink.manage_options+(
1.273 dwinter 1884: {'label':'add links config','action':'ECHO_link_addLinksForm'},
1.242 dwinter 1885: )
1.236 dwinter 1886:
1.241 dwinter 1887: def ECHO_link_addLinksForm(self):
1888: """Main configuration"""
1.236 dwinter 1889:
1.241 dwinter 1890: pt=zptFile(self, 'zpt/ChangeECHO_link_addLinks.zpt')
1891: return pt()
1892:
1893: def ECHO_link_addLinks(self,addLinks,RESPONSE):
1894: """add links"""
1.242 dwinter 1895: self.addLinks=addLinks
1.241 dwinter 1896: if RESPONSE is not None:
1897: RESPONSE.redirect('manage_main')
1898:
1.236 dwinter 1899: def content_html(self):
1900: """template fuer link"""
1.251 dwinter 1901:
1902:
1.236 dwinter 1903: if hasattr(self,"link_template"):
1.240 dwinter 1904: ret=ECHO_basis.content_html(self,'link')
1.251 dwinter 1905:
1.236 dwinter 1906: else:
1.240 dwinter 1907: ret=ECHO_basis.content_html(self,'collection')
1.51 dwinter 1908:
1.251 dwinter 1909:
1910: #return ret
1911: return ret
1912: #
1913: #
1914: # try:
1915: # return ret.decode('utf-8')
1916: # except:
1917: # try:
1918: # return ret.decode('latin-1')
1919: # except:
1920: #
1921: # return ret
1922: #
1.272 dwinter 1923: def getCopyrightsHTML(self):
1924: """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus"""
1925:
1926: if hasattr(self,'copyrightModel'):
1927: obj=self.copyrightModel
1928:
1929: else:
1930: return "ERROR"
1931: ret=[]
1932:
1933: for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID
1934:
1935:
1936: try:
1937: if hasattr(self.copyrightTypes,copyright[2]):
1938: copyrightTypeObj=getattr(self.copyrightTypes,copyright[2])
1939: link="copyrightTypes/"+copyright[2]+'/copyright.html'
1940: else:
1941: copyrightTypeObj=getattr(obj,copyright[2])
1942: link="copyrightModel/"+copyright[2]+'/copyright.html'
1943:
1944: label=copyrightTypeObj.label
1945: url=getattr(copyrightTypeObj, 'url', '')
1946:
1947: if url!='':
1948: ret.append((url,copyright[0],copyright[1],copyright[2],label))
1949: else:
1950: if hasattr(copyrightTypeObj, 'copyright.html'):
1951: ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label))
1952: else:
1953: ret.append(('empty',copyright[0],copyright[1],copyright[2],label))
1954: except:
1955: """nothing"""
1956:
1957: return ret
1958:
1959: def getInstitutionsHTML(self):
1960: """gibt Liste der foerdernden Institutionen aus"""
1961:
1962: if hasattr(self,'support'):
1963: obj=self.support
1964: ret=obj.getSupporter()
1965: return ret
1966: else:
1967: return ''
1968:
1969: def getOwnerOriginalsHTML(self):
1970: """gibt Liste der foerdernden Institutionen aus"""
1971:
1972: if hasattr(self,'ownerOriginal'):
1973: obj=self.ownerOriginal
1974: ret=obj.getOwner()
1975: return ret
1976: else:
1977: return ''
1978:
1979: def getDigiCopyByHTML(self):
1980: """gibt Liste der foerdernden Institutionen aus"""
1981:
1982: if hasattr(self,'digiCopyBy'):
1983: obj=self.digiCopyBy
1984: ret=obj.getDigiCopyBy()
1985: return ret
1986: else:
1987: return ''
1.240 dwinter 1988:
1.236 dwinter 1989: def index_html(self):
1990: """standard link"""
1991: if self.link:
1992: splitted=self.link.split("?")
1993: if len(splitted)>1:
1994: params=cgi.parse_qs(splitted[1])
1995:
1996: for x in params.keys():
1997: if type(params[x]) is ListType:
1998: params[x]=params[x][0]
1.210 dwinter 1999:
1.236 dwinter 2000:
2001: else:
2002: params={}
2003:
1.241 dwinter 2004: if getattr(self,'addLinks','yes')=="yes":
2005: params['backLink']=self.aq_parent.absolute_url()
2006: params['startLink']=splitted[0]+"?"+urllib.urlencode(params)
1.236 dwinter 2007:
1.289 casties 2008:
1.236 dwinter 2009: return self.REQUEST.RESPONSE.redirect(splitted[0]+"?"+urllib.urlencode(params))
2010: else:
2011: return ""
1.225 dwinter 2012:
1.51 dwinter 2013: def manage_addECHO_linkForm(self):
2014: """Form for external Links"""
1.195 casties 2015: pt=zptFile(self, 'zpt/AddECHO_linkForm.zpt')
1.51 dwinter 2016: return pt()
2017:
2018:
1.292 ! casties 2019: def manage_addECHO_link(self,id,title,label,description="",contentType="",responsible="",link="",weight="",coords=[],credits=None,linkType="external",RESPONSE=None):
1.51 dwinter 2020: """Add an external Link"""
2021:
1.292 ! casties 2022: newObj=ECHO_link(id,link,title,label,description,contentType,responsible,credits,weight,coords,linkType)
1.51 dwinter 2023:
2024: self._setObject(id,newObj)
1.241 dwinter 2025:
2026: getattr(self,id).addLinks='no'
2027:
1.51 dwinter 2028: if RESPONSE is not None:
2029: RESPONSE.redirect('manage_main')
1.236 dwinter 2030:
1.24 dwinter 2031:
1.256 dwinter 2032: class ECHO_collection(CatalogAware, Folder, Persistent, Implicit, Cacheable,ECHO_basis):
1.1 casties 2033: """ECHO Collection"""
1.84 dwinter 2034:
1.260 dwinter 2035: management_page_charset="utf-8"
1.1 casties 2036: security=ClassSecurityInfo()
2037: meta_type='ECHO_collection'
1.256 dwinter 2038: default_catalog='resourceCatalog'
2039:
1.202 casties 2040: # viewClassificationList=viewClassificationListMaster
1.69 dwinter 2041: displayTypes=displayTypes
2042:
1.130 dwinter 2043: path="/mpiwg/online/permanent/shipbuilding"
1.132 dwinter 2044:
1.275 dwinter 2045:
2046: def exportImportObjects_html(self,RESPONSE):
2047: """ImportObject"""
2048: pt=zptFile(self, 'zpt/exportImportObjects.zpt')
2049: pt.content_type="text/html"
2050: return pt()
2051:
2052: def importObjects_html(self,RESPONSE):
2053: """ImportObject"""
2054: pt=zptFile(self, 'zpt/importObjects.zpt')
2055: pt.content_type="text/html"
2056: return pt()
2057:
2058: def importObjects(self,zfile,RESPONSE=None,REQUEST=None):
2059: """import object from file"""
2060:
2061: zf=zipfile.ZipFile(zfile,"r")
2062: tmpdir=tempfile.mkdtemp() # create tempdir
2063: ret=None
2064:
2065: for name in zf.namelist():
2066: fn=tempfile.mkstemp()[1]
2067: tf=file(fn,"w")
2068: x=zf.read(name)
2069: tf.write(x)
2070: tf.close()
2071: try:
2072: self._importObjectFromFile(fn,set_owner=1)
2073: except:
2074: if not ret:
2075: ret=""
2076: ret+="Cannot import: %s (Already existing?)<br>"%name
2077: os.remove(fn)
2078:
2079: if ret:
2080: return """<html><body>%s</body></html>"""%ret
2081: if RESPONSE:
2082: RESPONSE.redirect(self.absolute_url())
2083:
2084: def exportObjects_html(self,RESPONSE):
2085: """Export objects"""
2086:
2087: pt=zptFile(self, 'zpt/exportObjects.zpt')
2088: pt.content_type="text/html"
2089: return pt()
2090:
2091: def exportObjects(self,ids,RESPONSE=None):
2092: """export objects with type id"""
2093: if not (type(ids) is ListType):
2094: ids=[ids]
2095:
2096: tmpdir=tempfile.mkdtemp() # create tempdir
2097: objs=self.ZopeFind(self,obj_ids=ids)
2098: tmpfile=tempfile.mkstemp()[1]
2099:
2100: zf=zipfile.ZipFile(tmpfile,"w")
2101: for obj in objs:
2102:
2103: f = os.path.join(tmpdir, '%s.zexp' %obj[0])
2104: #print E.absolute_url()
2105:
2106: obj[1]._p_jar.exportFile(obj[1]._p_oid, f)
2107:
2108: zf.write(f,obj[0])
2109:
2110: zf.close()
2111: shutil.rmtree(tmpdir)
2112: if RESPONSE:
2113: RESPONSE.setHeader("Content-Type","application/octet-stream")
2114: len=os.stat(tmpfile)[6]
2115: RESPONSE.setHeader("Content-Length",len)
2116: RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%"export.zip")
2117: fh=file(tmpfile)
2118: for x in fh.read():
2119: RESPONSE.write(x)
2120: fh.close()
2121:
1.256 dwinter 2122: def getMDValueSimpleSearchField(self):
2123: """returns value for simple search"""
2124: return " ".join([self.title,self.description])
2125:
1.238 dwinter 2126: def getTitleAndLabel(self):
2127: """gibt title und label zurueck"""
2128: return (getattr(self,'title',''),getattr(self,'label',''))
2129:
1.228 dwinter 2130: def localizeObjects(self):
1.236 dwinter 2131: """localize all objects"""
2132: contents=self.ZopeFind(self,obj_metatypes=['ECHO_externalLink','ECHO_link','ECHO_mapText'])
1.233 dwinter 2133:
1.236 dwinter 2134: find=self.ZopeFind(self,obj_ids=('locale_en'))
2135: if not find:
2136: self.manage_addECHO_locale("en",'','')
2137: for content in contents:
2138:
2139: if content[1].meta_type in ['ECHO_link','ECHO_externalLink']:
2140:
2141: find=content[1].ZopeFind(content[1],obj_metatypes=('ECHO_mapText'))
2142: if find:
2143: root=find[0][1]
2144:
2145: locale=find[0][1].ZopeFind(find[0][1],obj_ids=('locale_en'))
2146: else:
2147: root=None
2148: else:
2149: root=content[1]
2150: locale=content[1].ZopeFind(content[1],obj_ids=('locale_en'))
2151: if root and not locale:
2152: root.manage_addECHO_locale("en",'','')
2153:
2154: pt=zptFile(self, 'zpt/localizeObjects.zpt')
2155: return pt()
1.228 dwinter 2156:
2157:
2158: def localize(self,REQUEST,RESPONSE):
1.236 dwinter 2159: """localize"""
2160: for key in REQUEST.form.keys():
2161: splitted=key.split("!")
2162:
2163: if splitted[0]=="" or splitted[0]=="en" or splitted[0]=="title" or splitted[0]=="label":
2164: if splitted[0]=="en":
2165: setattr(self.locale_en,splitted[1],REQUEST.form[key])
2166: else:
2167: setattr(self,splitted[0],REQUEST.form[key])
2168: else:
2169: obj=getattr(self,splitted[0])
2170:
2171: if obj.meta_type=="ECHO_mapText":
2172: if splitted[1]=="en":
1.289 casties 2173: obj.locale_en.pt_edit(REQUEST.form[key],obj.locale_en.content_type)
1.236 dwinter 2174: else:
1.289 casties 2175: obj.pt_edit(REQUEST.form[key],obj.content_type)
1.236 dwinter 2176: else:
2177: text=obj.ZopeFind(obj,obj_metatypes=['ECHO_mapText'])
2178: if splitted[1]=="en":
2179:
1.289 casties 2180: text[0][1].locale_en.pt_edit(REQUEST.form[key],text[0][1].locale_en.content_type)
1.236 dwinter 2181: else:
1.289 casties 2182: text[0][1].pt_edit(REQUEST.form[key],text[0][1].content_type)
1.236 dwinter 2183: if RESPONSE is not None:
2184: RESPONSE.redirect('manage_main')
1.228 dwinter 2185:
2186:
1.142 dwinter 2187: def getRDF(self,urn=None):
1.236 dwinter 2188: """rdf of the collection"""
2189:
2190: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
2191:
2192: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
2193:
2194: if not urn:
2195: urn=self.absolute_url()
2196:
2197: li="""<RDF:li RDF:resource="%s" />\n"""
2198:
2199:
2200: for content in contents:
2201: ret+=content[1].getRDF()+"\n"
2202:
2203: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
2204: for content in contents:
2205: nurn=content[1].absolute_url()
2206: ret+=li%nurn
2207: return ret+"</RDF:Seq>"
2208:
1.161 dwinter 2209:
2210:
1.133 dwinter 2211: def changeLabels(self):
1.236 dwinter 2212: """change form"""
2213: pt=zptFile(self, 'zpt/changeLabelsForm')
2214: pt.content_type="text/html"
2215: return pt()
1.133 dwinter 2216:
2217: def changeTitles(self):
1.236 dwinter 2218: """change form"""
2219: pt=zptFile(self, 'zpt/changeTitleForm')
2220: pt.content_type="text/html"
2221: return pt()
1.163 dwinter 2222:
2223: def changeWeights(self):
1.236 dwinter 2224: """change form"""
2225: pt=zptFile(self, 'zpt/changeWeightForm')
2226: pt.content_type="text/html"
2227: return pt()
1.163 dwinter 2228:
1.161 dwinter 2229: def changeMetaDataLinks(self):
1.236 dwinter 2230: """change form"""
2231: pt=zptFile(self, 'zpt/changeMetaDataLinkForm')
2232: pt.content_type="text/html"
2233: return pt()
1.258 dwinter 2234:
2235: def changeAccessRightsCollectionForm(self,preselect=None):
2236: """change access rights of all resources in this collection"""
2237:
2238: pt=zptFile(self, 'zpt/changeAccessRightsCollectionForm')
2239: pt.content_type="text/html"
2240: return pt(preselect=preselect)
2241:
2242:
1.132 dwinter 2243: def changeAccessRightsCollection(self):
1.236 dwinter 2244: """change"""
2245: ret=""
2246: argv=self.REQUEST.form
2247:
2248: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
2249: for resource in resources:
2250:
1.258 dwinter 2251: if argv.has_key(resource[1].getId()+'_xml'):
2252: ret+=resource[1].getId()+" "+argv[resource[1].getId()+'_xml']+"</br>"
2253: resource[1].setAccessRightXML(argv[resource[1].getId()+'_xml'])
2254: resource[1].accessRight=argv[resource[1].getId()+'_xml']
2255: elif argv.has_key(resource[1].getId()+'_echo'):
2256: ret+="only local:"+resource[1].getId()+" "+argv[resource[1].getId()+'_echo']+"</br>"
2257: resource[1].accessRight=argv[resource[1].getId()+'_echo']
2258: else:
2259: ret+="ERROR:" +resource[0]
1.236 dwinter 2260: return ret
1.161 dwinter 2261:
2262: def changeMetaDataLinkInCollection(self):
1.236 dwinter 2263: """change all lables of a collection"""
2264: ret=""
2265: argv=self.REQUEST.form
2266:
2267: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
2268: for resource in resources:
2269:
2270: try:
2271: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1.161 dwinter 2272: resource[1].metalink=argv[resource[1].getId()][0:]
1.236 dwinter 2273: except:
2274: pass
2275: return ret
1.132 dwinter 2276:
1.163 dwinter 2277: def changeMetaDataLinkInCollection(self):
1.236 dwinter 2278: """change all lables of a collection"""
2279: ret=""
2280: argv=self.REQUEST.form
2281:
2282: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
2283: for resource in resources:
2284:
2285: try:
2286: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1.163 dwinter 2287: resource[1].metalink=argv[resource[1].getId()][0:]
1.236 dwinter 2288: except:
2289: pass
2290: return ret
1.163 dwinter 2291:
2292: def changeWeightsInCollection(self):
1.236 dwinter 2293: """change all lables of a collection"""
2294: ret=""
2295: argv=self.REQUEST.form
2296:
2297: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
2298: for resource in resources:
2299:
2300: try:
2301: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1.163 dwinter 2302: resource[1].weight=argv[resource[1].getId()][0:]
1.236 dwinter 2303: except:
2304: pass
2305: return ret
1.133 dwinter 2306:
2307: def changeTitlesInCollection(self):
1.236 dwinter 2308: """change all lables of a collection"""
2309: ret=""
2310: argv=self.REQUEST.form
2311:
2312: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
2313: for resource in resources:
2314:
2315: try:
2316: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1.133 dwinter 2317: resource[1].title=argv[resource[1].getId()][0:]
1.236 dwinter 2318: except:
2319: pass
2320: return ret
1.219 dwinter 2321:
2322: def changeLabelsInCollection(self):
1.236 dwinter 2323: """change all lables of a collection"""
2324: ret=""
2325: argv=self.REQUEST.form
2326:
2327: resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
2328: for resource in resources:
2329:
2330: try:
2331: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1.219 dwinter 2332: resource[1].label=argv[resource[1].getId()][0:]
1.236 dwinter 2333: except:
2334: pass
2335: return ret
1.219 dwinter 2336:
1.253 dwinter 2337: def importCollection(self,path=None,RESPONSE=None):
1.130 dwinter 2338: """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""
1.253 dwinter 2339:
2340: if path is None:
2341: pt=zptFile(self, 'zpt/importCollection.zpt')
2342: return pt()
2343:
2344: files=os.listdir(path)
1.236 dwinter 2345: ret=""
1.130 dwinter 2346: for fileName in files:
2347:
2348: if fileName:
1.236 dwinter 2349:
1.253 dwinter 2350: tempPath=re.sub("/mpiwg/online","",path)
1.236 dwinter 2351: link="http://echo.mpiwg-berlin.mpg.de/zogilib_book?fn="+tempPath+"/"+fileName+"/pageimg"
2352:
2353: metalink=self.path+"/"+fileName+"/index.meta"
1.130 dwinter 2354: try:
2355:
1.236 dwinter 2356: #link="http://nausikaa2.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.x.cgi?dir="+fileName+"&step=thumb"
2357:
2358: newObj=ECHO_resource(fileName,link,metalink,fileName,fileName,fileName,'generated','book','','','','','','')
2359: self._setObject(fileName,newObj)
1.130 dwinter 2360:
1.236 dwinter 2361: genObj=getattr(self,fileName)
1.130 dwinter 2362: #genObj.createIndexFile()
1.236 dwinter 2363: ret+="OK:"+fileName+"<br/>"
2364: except:
2365: print "ERROR"
2366: ret+="ERROR:"+fileName+"<br/>"
1.130 dwinter 2367:
1.236 dwinter 2368: return ret
1.130 dwinter 2369:
2370: if RESPONSE is not None:
2371: RESPONSE.redirect('manage_main')
2372:
1.123 dwinter 2373: def changeViewerTemplateSetsForm(self):
1.236 dwinter 2374: """change the viewer template set"""
2375: pt=zptFile(self, 'zpt/changeViewerTemplateSet')
1.123 dwinter 2376: return pt()
2377:
1.172 dwinter 2378: def getViewerTemplateSets(self,obj_ids=None,RESPONSE=None):
1.236 dwinter 2379: """Get the ViewerTemplateSet title for configuration"""
2380: ret=[]
2381:
2382: try:
2383: viewerTemplateSets=self.ZopeFind(self.viewerTemplateSets,obj_metatypes=['OSAS_viewerTemplateSet'],obj_ids=obj_ids)#assumes viewerTemplateSets folder somewhere in the hierarchie.
2384:
2385: for viewerTemplateSet in viewerTemplateSets:
2386: ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1]))
2387:
2388: return ret
2389:
2390: except:
2391: return [('no ViewerTemplateSetfolders','')]
1.123 dwinter 2392:
2393: def getTextToolsField(self,name,default=''):
1.236 dwinter 2394: """Lese viewerTemplateSet der Collection not implemented yet!"""
2395:
2396: return default
1.123 dwinter 2397:
2398:
2399: def isSelectedViewerTemplateSet(self,obj,id):
1.195 casties 2400: """is ausgewaehlt"""
1.123 dwinter 2401:
2402: if self.REQUEST['viewerTemplateSet']==id:
2403: return 1
2404: else:
2405: return None
2406:
1.280 dwinter 2407: def changeViewer(self,newViewer,REQUEST=None,RESPONSE=None):
2408: """changes all ressources to the newViewer"""
2409:
2410: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
2411: if RESPONSE is not None:
2412: RESPONSE.write("<html><body>")
2413:
2414: for resource in resources:
2415:
2416: done,msg=resource[1].changeViewer(newViewer)
2417: if done:
2418: if RESPONSE is not None:
2419: RESPONSE.write("<p>OK: %s"%resource[0])
2420: else:
2421: if RESPONSE is not None:
2422: RESPONSE.write("<p><a href='%s'>ERROR: %s (%s)</a>"%(resource[1].absolute_url()+'/ECHO_resource_config_main',resource[0],msg))
2423:
2424:
2425:
2426: if RESPONSE is not None:
2427: RESPONSE.write("<p>Done</p></body></html>")
2428:
1.155 dwinter 2429: def changeViewerTemplateSets(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None):
1.236 dwinter 2430: """change the templates"""
1.123 dwinter 2431:
1.236 dwinter 2432: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1.123 dwinter 2433:
1.236 dwinter 2434: for resource in resources:
1.130 dwinter 2435:
1.236 dwinter 2436: resource[1].changeViewerTemplateSet(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix)
1.123 dwinter 2437:
1.236 dwinter 2438: if RESPONSE is not None:
2439: RESPONSE.redirect('manage_main')
1.123 dwinter 2440:
2441:
1.153 dwinter 2442: def setStartpageFolderForm(self):
1.236 dwinter 2443: """Form for changing the startpage"""
1.153 dwinter 2444:
1.236 dwinter 2445:
2446: pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPageFolder.zpt')
1.153 dwinter 2447: pt.content_type="text/html"
2448: return pt()
2449:
2450: def setStartpageFolder(self,startpage=None,RESPONSE=None):
1.236 dwinter 2451: """change the templates"""
1.153 dwinter 2452:
1.236 dwinter 2453: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1.153 dwinter 2454:
1.236 dwinter 2455: for resource in resources:
1.153 dwinter 2456:
1.236 dwinter 2457: resource[1].setStartPage(startpage)
1.153 dwinter 2458:
1.236 dwinter 2459: if RESPONSE is not None:
2460: RESPONSE.redirect('manage_main')
1.153 dwinter 2461:
1.183 dwinter 2462: def copyTitleToInfoXMLFolder(self,RESPONSE=None):
1.236 dwinter 2463: """copy title into the title field of info.xml
2464: author and date werden leer!!!
2465: """
2466:
2467:
2468: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
2469:
2470:
2471: for resource in resources:
2472: ret,txt=resource[1].copyTitleToInfoXML()
2473: if (not ret) and RESPONSE:
2474: RESPONSE.write("error: %s\n"%txt)
2475: if ret and RESPONSE:
2476: RESPONSE.write("ok: %s\n"%txt)
2477:
1.284 dwinter 2478: #logger("ECHO (copyTitleToInfoXMLFolder)",logging.INFO,txt)
1.236 dwinter 2479: if RESPONSE is not None:
2480: RESPONSE.write("done!\n")
2481: RESPONSE.close()
2482: RESPONSE.redirect('manage_main')
2483:
1.130 dwinter 2484: def copySearchFields(self,RESPONSE=None):
1.253 dwinter 2485: """copys < metadatafields to the object"""
1.245 dwinter 2486: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
1.130 dwinter 2487:
1.236 dwinter 2488: for resource in resources:
1.130 dwinter 2489:
1.236 dwinter 2490: resource[1].copySearchFields()
1.130 dwinter 2491:
1.236 dwinter 2492: if RESPONSE is not None:
2493: RESPONSE.redirect('manage_main')
2494:
1.153 dwinter 2495: def reloadMetaDataFromStorageWarning(self,RESPONSE=None):
1.236 dwinter 2496: """warning"""
2497: pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt')
1.153 dwinter 2498: pt.content_type="text/html"
2499: return pt()
1.130 dwinter 2500:
2501: def reloadMetaDataFromStorage(self,RESPONSE=None):
1.236 dwinter 2502: """copy metadata from the storage to ECHO"""
1.130 dwinter 2503:
1.245 dwinter 2504: return reloadMetaDataFromStorage(self,RESPONSE)
1.130 dwinter 2505:
1.153 dwinter 2506:
1.98 dwinter 2507: def getPartnerCopyright(self,name,sonst="generic"):
1.236 dwinter 2508: """gibt generisches copyright eines partners aus, sonst behalte jetzige einsteillung"""
2509: #print "hi",name,sonst
2510: #print getattr(self.partners,name).copyrightType
2511: try:
2512: partner=getattr(self.partners,name)
2513: return partner.copyrightType
2514: except:
2515: print "error"
2516: return sonst
1.98 dwinter 2517:
2518: def partnerSelector_HTML(self,selected=None):
2519: """give type selector"""
1.236 dwinter 2520: if not selected:
2521: retStr="<option selected>\n"
2522: else:
2523: retStr="<option>\n"
2524:
2525: try: # erste version copyrightTypes exists
1.272 dwinter 2526: for partner in self.getPartners():
2527: partnerTitle = partner.title
2528: partnerId = partner.__name__
2529: if selected and (partnerId==selected):
2530: retStr+="""<option selected value="%s">%s\n"""%(partnerId,partnerTitle)
1.236 dwinter 2531: else:
1.272 dwinter 2532: retStr+="""<option value="%s">%s\n"""%(partnerId,partnerTitle)
1.236 dwinter 2533: except:
2534: """nothing"""
2535: return retStr
1.98 dwinter 2536:
1.202 casties 2537: # def getViewClassification(self):
2538: # if hasattr(self,'viewClassification'):
2539: # return self.viewClassification
2540: # else:
2541: # return ""
1.48 dwinter 2542:
1.236 dwinter 2543:
1.45 dwinter 2544: def createRessourcesFromXMLForm(self):
1.236 dwinter 2545: """form"""
2546: pt=zptFile(self, 'zpt/createRessourcesFromXMLForm.zpt')
2547: return pt()
1.83 dwinter 2548:
1.45 dwinter 2549: def createRessourcesFromXML(self,fileupload):
1.236 dwinter 2550: """read an XML file for generating resources"""
2551: dom=xml.dom.minidom.parse(fileupload)
2552: ret="<h2>Added</h2>"
2553: for resource in dom.getElementsByTagName('resource'):
2554: link=getText(resource.getElementsByTagName('link')[0].childNodes)
2555: label=getText(resource.getElementsByTagName('label')[0].childNodes)
1.277 dwinter 2556: pageimglink=getText(resource.getElementsByTagName('pageimglink')[0].childNodes)
1.236 dwinter 2557: #splitted=link.split("?")[0].split("/")
2558: #id=splitted[len(splitted)-1].encode('ascii')
2559: id=re.sub(" ","_",label).encode('ascii')
2560:
2561: ret+="<p>"+label+"</p>"
1.277 dwinter 2562: manage_addECHO_resource(self,id,label.encode('ascii'),label.encode('ascii'),"","",pageimglink.encode('ascii'),link.encode('ascii'),"","")
1.236 dwinter 2563: return ret
1.210 dwinter 2564:
2565: security.declarePublic('getImageTag')
1.25 dwinter 2566: def getImageTag(self):
2567: """GetTag"""
2568: try:
2569: return self.imageTag
2570: except:
2571: return ""
2572:
1.217 dwinter 2573:
1.222 dwinter 2574: def addMovie(self,id,title,label,description,contentType,responsible,link,thumbUrl,rawFile,lowresFile,metalink,weight,credits=None,coords=None,RESPONSE=None):
1.217 dwinter 2575: """SSS"""
1.228 dwinter 2576:
1.236 dwinter 2577: #manage_addECHO_movie(self,id,title,label,description,responsible,link,thumbUrl,rawFile,metalink,weight,credits=None,coords=None,RESPONSE=None)
2578: if not hasattr(self,id):
2579: try:
2580: manage_addECHO_movie(self,id,title,label,description,responsible,link,thumbUrl,rawFile,lowresFile,metalink,weight,credits=None,coords=None,RESPONSE=None)
2581: return "done"
2582: except:
2583: return None
2584: else:
2585: obj=getattr(self,id)
2586: obj.changeECHO_movie_main(metalink,link,rawFile,lowresFile,thumbUrl,title,label,description,contentType,weight=weight)
1.220 dwinter 2587:
1.236 dwinter 2588: return "changed"
1.220 dwinter 2589:
1.27 dwinter 2590: def addResource(self,id,title,label,description,contentType,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None):
1.24 dwinter 2591: """SSS"""
2592: try:
1.123 dwinter 2593: manage_addECHO_resource(self,id,title,label,description,responsible,link,metalink,weight,credits=None,coords=None,RESPONSE=None)
1.24 dwinter 2594: return "done"
2595: except:
2596: return None
1.32 dwinter 2597:
2598: def getSecondaryLink(self):
2599: """secondary link"""
2600: try:
2601: return self.secondaryLink
2602: except:
2603: return ""
2604:
2605: def getSecondaryLinkTitle(self):
2606: """secondary link"""
2607: try:
2608: return self.secondaryLinkTitle
2609: except:
2610: return ""
2611:
1.205 dwinter 2612: def getCollectionTreeXML(self,pwstr=None):
1.24 dwinter 2613: """Tree as XML"""
2614:
1.236 dwinter 2615: def addPassWd(str,pwstr=None):
2616: """adds a user/passwd to an url"""
2617: if pwstr:
2618: txt2=re.sub(r"(http://)(.*?)","\g<1>%s@\g<2>"%pwstr,str)
2619: else:
2620: txt2=re.sub(r"(http://)(.*?)","\g<1>www:3333@\g<2>",str)
2621: return txt2
1.171 dwinter 2622:
1.205 dwinter 2623: def getCollection(object,depth=0,pwstr=None):
1.24 dwinter 2624: depth+=1
2625: collections=""
2626: for entry in object.__dict__.keys():
2627: element=getattr(object,entry)
2628: try:
1.40 dwinter 2629: if element.meta_type in ["ECHO_collection","ECHO_group"]:
1.205 dwinter 2630: collections+="<element name=\""+urllib.quote(element.title)+"\" url=\""+addPassWd(element.absolute_url(),pwstr=pwstr)+"\">"
1.24 dwinter 2631: collections+=getCollection(element,depth)+"</element>\n"
2632: except:
2633: """nothing"""
2634: return collections
2635:
1.236 dwinter 2636: ret="""<?xml version="1.0" encoding="utf-8" ?>"""
1.205 dwinter 2637: return ret+"<collection>"+getCollection(self,pwstr=pwstr)+"</collection>"
1.24 dwinter 2638:
1.288 casties 2639: def createAllJSAreas(self,mapColTypes=None):
1.195 casties 2640: """create area calls for JavaScript"""
1.288 casties 2641: areas = self.getAllMapAreas(mapColTypes=mapColTypes)
1.236 dwinter 2642: return self.createJSAreas(areas)
1.195 casties 2643:
1.256 dwinter 2644:
2645: emptyPartner=ECHO_partner("", "","", "", "", "", "", "", "")
2646:
1.1 casties 2647: security.declarePublic('getCreditObject')
2648: def getCreditObject(self,name):
2649: """credit id to credititem"""
1.15 dwinter 2650: try:
2651: return getattr(self.partners,name)
2652: except:
1.256 dwinter 2653:
2654: return self.emptyPartner
2655:
2656:
1.1 casties 2657: security.declarePublic('ECHO_generateNavBar')
2658: def ECHO_generateNavBar(self):
2659: """Erzeuge Navigationsbar"""
2660: link=""
2661: object="self"
2662: ret=[]
2663: path=self.getPhysicalPath()
2664: for element in path:
2665:
2666:
2667: if not element=="":
2668: object+="."+element
2669:
2670: label=eval(object).label
2671: link+="/"+element
2672: if not label=="":
2673: ret.append((label,link))
2674: return ret
2675:
1.49 dwinter 2676:
1.153 dwinter 2677: def ECHO_rerenderLinksMDWarning(self):
1.236 dwinter 2678: """change form"""
2679: pt=zptFile(self, 'zpt/rerenderLinksWarning')
2680: pt.content_type="text/html"
2681: return pt()
1.91 dwinter 2682:
1.49 dwinter 2683:
1.153 dwinter 2684:
1.195 casties 2685: security.declarePublic('ECHO_rerenderLinksMD')
1.153 dwinter 2686: def ECHO_rerenderLinksMD(self,obj=None,types=['title','label']):
2687: """Rerender all Links"""
1.236 dwinter 2688: return ECHO_rerenderLinksMD(self,obj,types)
1.19 dwinter 2689:
1.236 dwinter 2690:
1.281 dwinter 2691: def __init__(self,id,title,label,description="",contentType="",responsible="",credits="",weight="",sortfield="",coords=[],secondaryLinkTitle="",secondaryLink="",imageTag="",bgcolour="",isVisible=True):
1.91 dwinter 2692:
1.1 casties 2693: self.id = id
2694: """Festlegen der ID"""
2695: self.credits=toList(credits)
2696: self.label = label
2697: self.title=title
2698: self.description=description
1.27 dwinter 2699: self.contentType=contentType
1.1 casties 2700: self.responsible=responsible
1.25 dwinter 2701: self.imageTag=imageTag
1.1 casties 2702: self.weight=weight
2703: self.sortfield=sortfield
2704: coordsnew=[ string.split(x,",") for x in coords]
2705: self.coords=coordsnew
1.32 dwinter 2706: self.secondaryLinkTitle=secondaryLinkTitle
2707: self.secondaryLink=secondaryLink
1.236 dwinter 2708: self.bgcolour=bgcolour
1.286 dwinter 2709: self.isVisible=isVisible
1.32 dwinter 2710:
1.1 casties 2711:
1.154 dwinter 2712: manage_options = Folder.manage_options+ Cacheable.manage_options+(
1.13 dwinter 2713: {'label':'Main Config','action':'ECHO_collection_config'},
1.133 dwinter 2714: {'label':'Change Labels','action':'changeLabels'},
2715: {'label':'Change Titles','action':'changeTitles'},
1.236 dwinter 2716: {'label':'Localize','action':'localizeObjects'},
2717: {'label':'Change Weights','action':'changeWeights'},
1.153 dwinter 2718: {'label':'Rerender Labels and Titles','action':'ECHO_rerenderLinksMDWarning'},
1.275 dwinter 2719: {'label':'Export/Import Objects','action':'exportImportObjects_html'},
1.199 casties 2720: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
1.236 dwinter 2721: {'label':'create resources from XML','action':'createRessourcesFromXMLForm'},
2722: {'label':'Set Startpage','action':'setStartpageFolderForm'},
1.155 dwinter 2723: {'label':'Change Viewer Templates and Image Viewer','action':'changeViewerTemplateSetsForm'},
1.236 dwinter 2724: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},
1.253 dwinter 2725: {'label':'ImportCollection','action':'importCollection'},
1.236 dwinter 2726: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
1.258 dwinter 2727: {'label':'Change access rights', 'action':'changeAccessRightsCollectionForm'},
1.1 casties 2728: )
2729:
2730:
1.13 dwinter 2731: security.declarePublic('ECHO_collection_config')
2732: def ECHO_collection_config(self):
1.1 casties 2733: """Main configuration"""
2734:
2735: if not hasattr(self,'weight'):
2736: self.weight=""
2737:
2738: if not hasattr(self,'sortfield'):
2739: self.sortfield="weight"
1.13 dwinter 2740:
1.195 casties 2741: pt=zptFile(self, 'zpt/ChangeECHO_collection.zpt')
1.1 casties 2742: return pt()
2743:
2744:
1.34 dwinter 2745: def getBgcolour(self):
1.236 dwinter 2746: """colour"""
2747: if hasattr(self,'bgcolour') and not (self.bgcolour==""):
2748: return self.bgcolour
2749: else:
2750: return "#dddddd"
1.195 casties 2751:
1.236 dwinter 2752:
2753: security.declarePublic('changeECHO_collection')
1.281 dwinter 2754: 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="",isVisible=True):
1.71 casties 2755: """Aenderung der Properties"""
1.10 dwinter 2756:
1.32 dwinter 2757: self.secondaryLink=secondaryLink
2758: self.secondaryLinkTitle=secondaryLinkTitle
1.25 dwinter 2759: self.imageTag=imageTag
1.236 dwinter 2760: self.bgcolour=bgcolour
1.105 dwinter 2761: self.location=location
1.236 dwinter 2762: self.isAlwaysClickable=isAlwaysClickable
2763: self.prefix=prefix[0:]
2764: self.suffix=suffix[0:]
1.286 dwinter 2765: self.setIsVisible(isVisible)
1.236 dwinter 2766:
1.198 casties 2767: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
1.236 dwinter 2768:
1.1 casties 2769: self.sortfield=sortfield
2770:
2771: if RESPONSE is not None:
2772: RESPONSE.redirect('manage_main')
2773:
1.169 dwinter 2774: def setAlwaysClickable(self,flag="yes"):
1.236 dwinter 2775: """set clickable"""
2776: if flag=="yes":
2777: self.isAlwaysClickable="yes"
2778: else:
2779: self.isAlwaysClickable=None
1.23 dwinter 2780:
1.236 dwinter 2781: return flag
1.169 dwinter 2782:
1.23 dwinter 2783: def showOverview(self):
2784: """overview"""
2785: if 'ECHO_overview.html' in self.__dict__.keys():
2786: return getattr(self,'ECHO_overview.html')()
1.195 casties 2787: pt=zptFile(self, 'zpt/ECHO_content_overview.zpt')
1.23 dwinter 2788: return pt()
2789:
1.224 casties 2790:
1.84 dwinter 2791: security.declareProtected('View','index_html')
1.1 casties 2792: def index_html(self):
2793: """standard page"""
1.154 dwinter 2794: if self.ZCacheable_isCachingEnabled():
2795:
2796: result = self.ZCacheable_get()
2797: if result is not None:
2798: # Got a cached value.
2799: return result
1.236 dwinter 2800:
1.1 casties 2801: if 'index.html' in self.__dict__.keys():
1.154 dwinter 2802: ret=getattr(self,'index.html')()
1.32 dwinter 2803:
1.1 casties 2804: elif 'overview' in self.__dict__.keys():
1.154 dwinter 2805: ret=self.showOverview()
1.32 dwinter 2806: elif hasattr(self,'collection_index_template'):
1.154 dwinter 2807: ret=self.collection_index_template()
1.54 dwinter 2808: elif hasattr(self,'main_index_template'):
1.209 dwinter 2809:
2810: ret=self.main_index_template.__of__(self)(self.main_template)
1.154 dwinter 2811: else:
1.236 dwinter 2812: pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt')
2813: pt.content_type="text/html"
2814: ret=pt.render()
1.154 dwinter 2815:
1.236 dwinter 2816: self.ZCacheable_set(ret)
1.154 dwinter 2817: return ret
1.1 casties 2818:
1.210 dwinter 2819: security.declarePublic('content_html')
1.189 dwinter 2820: def content_html(self,**argv):
1.29 dwinter 2821: """template fuer content"""
1.236 dwinter 2822: #print "NN",argv
1.240 dwinter 2823: ret = ECHO_basis.content_html(self,'collection')
1.243 dwinter 2824:
1.260 dwinter 2825: if type(ret) is StringType:
2826: return ret.decode('utf-8')
2827: else:
2828: return ret
2829:
1.240 dwinter 2830:
1.11 dwinter 2831: def getCredits(self):
2832: """Ausgabe der credits"""
2833: if self.credits:
2834: return self.credits
2835: else:
2836: return []
1.1 casties 2837:
1.65 casties 2838: def area_img(self):
2839: """area image"""
1.236 dwinter 2840: bt = BrowserCheck(self)
2841: if bt.isIE or bt.isN4:
2842: return sendFile(self, 'images/red.gif', 'image/gif')
2843: else:
2844: return sendFile(self, 'images/reda.png', 'image/png')
1.87 casties 2845:
2846: def trans_img(self):
2847: """empty image"""
2848: return sendFile(self, 'images/trans.gif', 'image/gif')
1.65 casties 2849:
2850: def hl_lib_js(self):
2851: """javascript"""
1.79 casties 2852: return sendFile(self, 'js/hl_lib.js', 'text/plain')
1.65 casties 2853:
2854: def js_lib_js(self):
1.195 casties 2855: """javascript -- old name"""
2856: return sendFile(self, 'js/baselib.js', 'text/plain')
2857:
2858: def baselib_js(self):
2859: """javascript"""
2860: return sendFile(self, 'js/baselib.js', 'text/plain')
2861:
2862: def hl_add_js(self):
1.65 casties 2863: """javascript"""
1.195 casties 2864: return sendFile(self, 'js/hl_add.js', 'text/plain')
1.23 dwinter 2865:
1.288 casties 2866: def getAllMapAreas(self,mapColTypes=None):
1.1 casties 2867: """Give list of coordinates"""
1.288 casties 2868: if mapColTypes is None:
2869: mapColTypes=['ECHO_collection','ECHO_resource','ECHO_link','ECHO_externalLink']
2870:
1.195 casties 2871: areas=[]
1.211 dwinter 2872: for entry in self.getSubCols(subColTypes=mapColTypes):
1.202 casties 2873: object=entry
1.236 dwinter 2874: areas.extend(object.getMapAreas())
1.195 casties 2875: return areas
1.1 casties 2876:
1.42 dwinter 2877:
1.195 casties 2878: def deleteMapAreas(self):
1.236 dwinter 2879: """deletes all map areas from this object"""
2880: for obs in self.ZopeFind(self, obj_metatypes=['MapArea'], search_sub=1):
2881: ob = obs[1]
2882: id = ob.id
2883: parent = ob.aq_parent
2884: print "deleting: ", ob.id
2885: parent._delObject(id)
2886: return "Done"
1.195 casties 2887:
1.42 dwinter 2888:
1.41 dwinter 2889: getSubCols = ECHO_helpers.getSubCols
1.259 dwinter 2890:
2891: def getSubcolsXMLRpc(self,searchSimple):
2892: """simplesearch results suitable for xml rpc, gives back array objid,url"""
2893:
2894: return [x.absolute_url() for x in self.getSubCols(searchSimple=searchSimple)]
2895:
2896:
1.84 dwinter 2897: Globals.InitializeClass(ECHO_collection)
1.1 casties 2898:
1.13 dwinter 2899: def manage_addECHO_collectionForm(self):
2900: """Add collection form"""
1.195 casties 2901: pt=zptFile(self, 'zpt/AddECHO_collectionForm.zpt')
1.1 casties 2902: return pt()
2903:
2904:
1.281 dwinter 2905: def manage_addECHO_collection(self,id,title,label,description="",contentType="",responsible="",weight=0,sortfield="weight",coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour="",isVisible=True):
1.13 dwinter 2906: """add a echo collection"""
1.1 casties 2907:
2908:
1.281 dwinter 2909: newObj=ECHO_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="",isVisible=isVisible)
1.1 casties 2910:
2911: self._setObject(id,newObj)
1.13 dwinter 2912:
1.1 casties 2913: if RESPONSE is not None:
2914: RESPONSE.redirect('manage_main')
2915:
1.38 dwinter 2916: class ECHO_group(ECHO_collection):
1.236 dwinter 2917: """ECHO Gruppe"""
2918: security=ClassSecurityInfo()
2919: meta_type="ECHO_group"
2920:
2921: manage_options = Folder.manage_options+(
2922: {'label':'Main Config','action':'ECHO_group_config'},
2923: {'label':'Rerender Links','action':'ECHO_rerenderLinksMDWarning'},
2924: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
2925: )
2926:
2927: security.declareProtected('View','index_html')
2928:
2929:
2930: def getRDF(self,urn=None):
2931: """rdf of the collection"""
2932: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
2933:
2934: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
2935:
2936:
2937: if not urn:
2938: urn=self.absolute_url()
2939: li="""<RDF:li RDF:resource="%s" />\n"""
2940:
2941:
2942: for content in contents:
2943: ret+=content[1].getRDF()+"\n"
2944:
2945: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
2946: for content in contents:
2947: nurn=content[1].absolute_url()
2948: ret+=li%nurn
2949: return ret+"</RDF:Seq>"
2950:
2951: def index_html(self):
2952: """standard page"""
2953: displayedObjects=self.ZopeFind(self,obj_metatypes=displayTypes)
2954: #if (len(displayedObjects)==1) and (displayedObjects[0][1].meta_type=="ECHO_collection"): # nur ein Object dann redirect auf dieses Object
2955: # return self.REQUEST.RESPONSE.redirect(displayedObjects[0][1].absolute_url())
2956:
2957: if 'index.html' in self.__dict__.keys():
2958: return getattr(self,'index.html')()
2959:
2960: elif 'overview' in self.__dict__.keys():
2961: return self.showOverview()
2962: elif hasattr(self,'group_index_template'):
2963: return self.group_index_template()
2964: elif hasattr(self,'collection_index_template'):
2965: return self.collection_index_template()
2966: elif hasattr(self,'main_index_template'):
2967: return self.main_index_template()
2968:
2969: pt=zptFile(self, 'zpt/ECHO_main_index_template_standard.zpt')
2970: pt.content_type="text/html"
2971: return pt()
2972:
2973: def ECHO_group_config(self):
2974: """Main configuration"""
2975:
2976: if not hasattr(self,'weight'):
2977: self.weight=""
2978:
2979: if not hasattr(self,'sortfield'):
2980: self.sortfield="weight"
2981:
2982: if not hasattr(self,'coords'):
2983: self.coords=[]
2984:
2985: pt=zptFile(self, 'zpt/ChangeECHO_group.zpt')
2986: return pt()
2987:
2988: def changeECHO_group(self,title,label,description,contentType,responsible,weight,secondaryLink,secondaryLinkTitle,credits=None,sortfield="weight",coords=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
2989: """Aenderung der Properties"""
2990:
2991: self.secondaryLink=secondaryLink
2992: self.secondaryLinkTitle=secondaryLinkTitle
2993: self.imageTag=imageTag
2994: self.bgcolour=bgcolour
1.43 dwinter 2995: self.logo=logo
2996:
1.236 dwinter 2997: setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight)
1.38 dwinter 2998:
2999:
3000:
1.236 dwinter 3001: self.sortfield=sortfield
1.38 dwinter 3002:
1.236 dwinter 3003: if RESPONSE is not None:
3004: RESPONSE.redirect('manage_main')
1.40 dwinter 3005:
1.236 dwinter 3006: def getLogo(self):
3007: """logo ausgeben"""
1.43 dwinter 3008: try:
3009: return self.logo
3010: except:
3011: return "ECHO_groups"
1.40 dwinter 3012:
1.210 dwinter 3013: security.declarePublic('content_html')
1.236 dwinter 3014: def content_html(self):
3015: """template fuer content"""
3016: return ECHO_basis.content_html(self,'group')
1.38 dwinter 3017:
3018:
3019:
3020: def manage_addECHO_groupForm(self):
3021: """Add group form"""
1.195 casties 3022: pt=zptFile(self, 'zpt/AddECHO_groupForm.zpt')
1.38 dwinter 3023: return pt()
3024:
3025:
1.43 dwinter 3026: def manage_addECHO_group(self,id,title,label,description,contentType,responsible,weight,sortfield,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour="",logo=""):
1.38 dwinter 3027: """add a echo group"""
3028:
3029:
3030: newObj=ECHO_group(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
3031:
1.43 dwinter 3032: setattr(newObj,'logo',logo)
1.38 dwinter 3033: self._setObject(id,newObj)
1.43 dwinter 3034:
1.38 dwinter 3035: if RESPONSE is not None:
3036: RESPONSE.redirect('manage_main')
3037:
1.84 dwinter 3038: Globals.InitializeClass(ECHO_group)
1.85 dwinter 3039:
3040:
3041: class ECHO_userFolder(UserFolder):
1.236 dwinter 3042: """User folder for Intranet"""
3043: _domain_auth_mode=1 # Identification via domain
3044: meta_type="ECHO_userFolder"
3045:
3046: def authenticate(self, name, password, request):
3047: emergency = self._emergency_user
3048: if name is None:
3049: return None
3050: if emergency and name==emergency.getUserName():
3051: user = emergency
3052: else:
3053: user = self.getUser(name)
3054: if user is not None and user.authenticate(password, request):
3055: return user
3056: else:
3057: return None
3058:
3059: def domainSpecMatch(self,spec, request):
3060: host=''
3061: addr=''
3062:
3063: # Fast exit for the match-all case
3064: if len(spec) == 1 and spec[0] == '*':
3065: return 1
3066:
3067: if request.has_key('REMOTE_HOST'):
3068: host=request['REMOTE_HOST']
3069:
3070: if request.has_key('REMOTE_ADDR'):
3071: addr=request['REMOTE_ADDR']
3072:
3073: if request.has_key('HTTP_X_FORWARDED_FOR'):
3074: addr=request['HTTP_X_FORWARDED_FOR']
3075:
3076:
3077: if not host and not addr:
3078: return 0
3079:
3080: if not host:
3081: try: host=socket.gethostbyaddr(addr)[0]
3082: except: pass
3083: if not addr:
3084: try: addr=socket.gethostbyname(host)
3085: except: pass
3086:
3087:
3088: _host=host.split('.')
3089: _addr=addr.split('.')
3090: _hlen=len(_host)
3091: _alen=len(_addr)
3092:
3093: for ob in spec:
3094: sz=len(ob)
3095: _ob=ob.split('.')
3096: _sz=len(_ob)
3097:
3098: mo = addr_match(ob)
3099: if mo is not None:
3100: if mo.end(0)==sz:
3101: fail=0
3102: for i in range(_sz):
3103: a=_addr[i]
3104: o=_ob[i]
3105: if (o != a) and (o != '*'):
3106: fail=1
3107: break
3108: if fail:
3109: continue
3110: return 1
3111:
3112: mo = host_match(ob)
3113: if mo is not None:
3114: if mo.end(0)==sz:
3115: if _hlen < _sz:
3116: continue
3117: elif _hlen > _sz:
3118: _item=_host[-_sz:]
3119: else:
3120: _item=_host
3121: fail=0
3122: for i in range(_sz):
3123: h=_item[i]
3124: o=_ob[i]
3125: if (o != h) and (o != '*'):
3126: fail=1
3127: break
3128: if fail:
3129: continue
3130: return 1
3131: return 0
1.85 dwinter 3132:
3133: Globals.default__class_init__(ECHO_userFolder)
3134:
3135:
3136:
3137: def manage_addECHO_userFolder(self,dtself=None,REQUEST=None,**ignored):
3138: """add a user folder """
3139: f=ECHO_userFolder()
3140: self=self.this()
3141: try: self._setObject('acl_users', f)
3142: except: return MessageDialog(
3143: title ='Item Exists',
3144: message='This object already contains a User Folder',
3145: action ='%s/manage_main' % REQUEST['URL1'])
3146: self.__allow_groups__=f
3147: if REQUEST is not None:
3148: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
3149:
3150: def manage_addECHO_userFolderForm(self):
1.236 dwinter 3151: """add a user folder form"""
3152: return manage_addECHO_userFolder(self)
1.85 dwinter 3153:
1.165 dwinter 3154:
3155:
1.167 dwinter 3156: def createNode(self,descrs,node):
1.236 dwinter 3157: name=descrs[node]['name']
3158: type=descrs[node]['type']
3159: urn=node
3160: #print " will create",node.encode('utf-8')
3161: id=re.sub('[^a-zA-Z0-9]','',name).encode('ascii','ignore')
3162: #print "id",id
3163: #print type
3164: #self.REQUEST.RESPONSE.write("<p>%s<p>\n"%id)
3165: if type=="CDLI_group":
3166:
3167: try:
3168: manage_addECHO_collection(self,id,name,name,"","","","","")
3169:
3170: except:
3171: self.REQUEST.RESPONSE.write("<p>Error%s</p>\n"%id)
3172:
3173: self.REQUEST.RESPONSE.write("<p>Creates:%s</p>\n"%getattr(self,id).absolute_url())
3174:
3175: return type,getattr(self,id),urn
3176:
3177: if type=="CDLI_item":
3178: try:
3179: manage_addECHO_resource(self,id,name,name,"","",urn,"","")
3180: except:
3181: self.REQUEST.RESPONSE.write("<p>Error%s</p>\n"%id)
3182: self.REQUEST.RESPONSE.write("<p>Creates:%s</p>\n"%getattr(self,id).absolute_url())
3183:
3184:
3185: return "XX"
1.165 dwinter 3186:
3187:
1.1 casties 3188: class ECHO_root(Folder,Persistent,Implicit):
3189: """ECHO Root Folder"""
1.85 dwinter 3190:
3191: security=ClassSecurityInfo()
3192:
1.1 casties 3193: meta_type="ECHO_root"
1.260 dwinter 3194: management_page_charset="utf-8"
1.236 dwinter 3195:
1.264 dwinter 3196: getSubCols = ECHO_helpers.getSubCols
3197:
3198: manage_options=Folder.manage_options+(
3199: {'label':'Main Config','action':'ECHO_copyright_configForm'},
3200: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},
3201: {'label':'Change Weights','action':'changeWeights'},
3202: {'label':'Generate from RDF','action':'generateFromRDFForm'},
3203: {'label':'update Resource Catalog','action':'updateResourceCatalog'},
1.266 dwinter 3204: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
1.264 dwinter 3205: )
3206:
1.275 dwinter 3207:
1.266 dwinter 3208: def copySearchFields(self,RESPONSE=None):
3209: """copys < metadatafields to the object"""
3210: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
3211:
3212: for resource in resources:
3213:
3214: resource[1].copySearchFields()
3215:
3216: if RESPONSE is not None:
3217: RESPONSE.redirect('manage_main')
1.264 dwinter 3218:
1.254 dwinter 3219: def mod_re_sub(self,pattern,replace,string):
3220: """re.sub aus mod re zur Verfuegung stellen"""
3221: return re.sub(pattern,replace,string)
3222:
1.238 dwinter 3223: def findObjectFromFulltext(self,existUri):
1.236 dwinter 3224: '''
3225:
3226: @param url:
3227: @param existUri:
3228: '''
1.238 dwinter 3229:
3230: if existUri:
3231: #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids.
3232: filename=existUri.split("/")[-1]
3233:
3234: founds=self.resourceCatalog.search({'fullTextUrl':os.path.splitext(filename)[0]})
3235:
3236: ret=[(found.title,found.getObject().absolute_url(),found.getObject().aq_parent.absolute_url()) for found in founds]
3237:
3238: return ret
1.236 dwinter 3239:
3240: def reindex(self,RESPONSE=None):
3241: """indiziere alle Objecte neu"""
3242:
3243: if RESPONSE:
3244: RESPONSE.write("<html><body>")
3245:
3246: resources=self.ZopeFind(self,obj_metatypes=["ECHO_resource"], search_sub=1)
3247:
3248: for resource in resources:
3249: resource[1].reindex()
1.256 dwinter 3250: #print "<p> done %s </p>\n"
1.236 dwinter 3251: if RESPONSE:
3252: RESPONSE.write("<p> done %s </p>\n"%resource[0])
3253:
3254: if RESPONSE:
3255: RESPONSE.write("<p> ok </p></html></body>\n")
3256:
1.228 dwinter 3257:
3258: def setLanguage(self,lang):
1.236 dwinter 3259: """Set language cookie"""
3260: self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")
1.228 dwinter 3261:
3262: def switchLanguage(self):
1.236 dwinter 3263: """Set language cookie"""
3264: if self.getLanguage()=="en":
3265: lang="de"
3266: else:
3267: lang="en"
3268:
3269: self.REQUEST.RESPONSE.setCookie('lang_exhibition',lang,path="/")
3270: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1'])
1.265 dwinter 3271:
1.228 dwinter 3272: def getLanguage(self):
1.236 dwinter 3273: """get language cookie"""
3274: lang= self.REQUEST.cookies.get('lang_exhibition','de')
3275: if lang == '':
3276: lang="de"
3277: return lang
1.228 dwinter 3278:
1.203 casties 3279: def getContentOverviewTemplate(self):
1.236 dwinter 3280: """produces overview template with macro"""
3281: pt = zptObjectOrFile(self, 'content_overview_template')
3282: return pt
1.165 dwinter 3283:
1.224 casties 3284: def mapstyle_css(self):
3285: """send mapstyle.css"""
3286: sendFile(self, 'html/ECHO_mapstyle.css', 'text/css')
3287:
3288:
1.202 casties 3289: ###Cdli adds -> have to be removed
1.165 dwinter 3290: def getTablet(self,item):
1.167 dwinter 3291: #print "getTablet"
1.236 dwinter 3292: try:
3293: read=urllib.urlopen("http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"%item).read()
1.167 dwinter 3294: read=re.sub("\[search\]","search",read)
1.236 dwinter 3295: return read[read.find("<body>")+6:read.rfind("</body>")]
3296: except:
3297: return "<h1>Sorry no connection to the data server enlil.museum.upenn.edu</h1>"
3298: #return "http://enlil.museum.upenn.edu/cgi-bin/cdlget.plx?item=%s&project=ncdl"
1.167 dwinter 3299: ###END CDLI add
3300:
1.186 dwinter 3301:
1.200 casties 3302: def URLquote(self, text):
3303: """urllib.quote fuer Michael"""
1.236 dwinter 3304: return urllib.quote(text)
1.200 casties 3305:
3306:
1.186 dwinter 3307: def checkResource(self,id):
1.236 dwinter 3308: """checks if a resource is in the tree, gives back none or list of resources"""
3309: if not id:
3310: id=""
3311: splitted=id.split("/")
3312: id=splitted[len(splitted)-1]
3313: if hasattr(self,"_v_checkResource") and self._v_checkResource.has_key(id): #existiert ein cache und id ist bereits drin?
3314: return self._v_checkResource[id]
3315:
3316: else:
3317: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],obj_ids=[id],search_sub=1)
3318:
3319: if not hasattr(self,"_v_checkResource"): self._v_checkResource={}#lege cache an falls nicht existent
3320: if resources:
3321: self._v_checkResource[id]=resources[0:] # slicing to be sure that data is stabil
3322: else:
3323: self._v_checkResource[id]=None
3324:
3325: return self._v_checkResource[id]
3326:
1.177 dwinter 3327: def sendForm(self,fromaddr,content,server='mail.mpiwg-berlin.mpg.de'):
1.236 dwinter 3328: """sendform"""
3329: toaddrs=["dwinter@mpiwg-berlin.mpg.de"]
3330:
3331: msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
3332: % (fromaddr, ", ".join(toaddrs),"testsub"))
3333: server = smtplib.SMTP(server)
3334: #server.set_debuglevel(1)
3335: msg=msg+content
3336: server.sendmail(fromaddr, toaddrs, msg)
3337: server.quit()
3338:
1.167 dwinter 3339: def generateFromRDFForm(self):
1.236 dwinter 3340: """change form"""
3341: pt=zptFile(self, 'zpt/generateFromRDFForm')
3342: pt.content_type="text/html"
3343: return pt()
1.167 dwinter 3344:
3345: def generateFromRDF(self,file,startNode="/Cuneiform Corpus"):
3346:
1.236 dwinter 3347: """generate from RDF"""
3348:
3349: global seqs
3350: seqs={}
3351: global descrs
3352: descrs={}
3353: global key
3354: key=""
3355: global value
3356: value=""
3357:
3358: def getEdges(seqs,urn):
3359: """edges"""
3360: ret=[]
3361: return seqs[urn]
3362:
3363: def createSubs(self,seqs,descrs,urn,level=0):
3364: """create subs"""
3365: for edge in getEdges(seqs,urn):
3366: cn=createNode(self,descrs,edge)
3367: if cn[0]=="CDLI_group":
3368: createSubs(cn[1],seqs,descrs,cn[2],level+1)
3369: return
3370:
3371: def start_element(name,attrs):
3372:
3373: global seqs
3374: global descrs
3375: global key
3376: global value
3377: seq=""
3378: if name=="RDF:Seq":
3379: key=attrs.get('RDF:about')
3380: try: # teste ob liste
3381: x=seqs[key][0]
3382: except:
3383:
3384: seqs[key]=[]
3385:
3386:
3387: elif name=="RDF:Description":
3388: key=attrs.get('RDF:about')
3389:
3390:
3391: elif name=="RDF:li":
3392: name=attrs.get('RDF:resource')
3393: seqs[key].append(name)
3394:
3395: elif name=="ECHONAVIGATION:type":
3396: value="type"
3397:
3398: elif name=="ECHONAVIGATION:name":
3399: value="name"
3400: elif name=="ECHONAVIGATION:linkClickable":
3401: value="linkClickable"
3402:
3403: def end_element(name):
3404: """nothing"""
3405: key=""
3406: value=""
3407:
3408: def char_data(data):
3409: """nothing"""
1.165 dwinter 3410:
1.236 dwinter 3411: data=re.sub("\n","",data)
3412: try:
3413: if descrs[key].has_key(value):
3414: descrs[key][value]+=data
3415: else:
3416: descrs[key][value]=data
3417: except:
3418:
3419: descrs[key]={}
3420: descrs[key][value]=data
3421:
3422: p = xml.parsers.expat.ParserCreate()
3423:
3424: p.StartElementHandler = start_element
3425: p.EndElementHandler = end_element
3426: p.CharacterDataHandler = char_data
3427:
3428:
3429: p.ParseFile(file)
3430: self.REQUEST.RESPONSE.write("<html><body><h1>Start</h1>")
3431: createSubs(self,seqs,descrs,startNode)
3432: self.REQUEST.RESPONSE.write("<h1>done</h1></body></html>")
3433: #print "done"
1.165 dwinter 3434:
1.236 dwinter 3435:
3436: return "done"
1.165 dwinter 3437:
1.236 dwinter 3438:
1.165 dwinter 3439:
1.236 dwinter 3440:
1.163 dwinter 3441: def changeWeightsInCollection(self):
1.236 dwinter 3442: """change all lables of a collection"""
3443: ret=""
3444: argv=self.REQUEST.form
3445:
3446: resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink'])
3447: for resource in resources:
3448:
3449: try:
3450: ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"</br>"
1.163 dwinter 3451: resource[1].weight=argv[resource[1].getId()][0:]
1.236 dwinter 3452: except:
3453: pass
3454: return ret
1.153 dwinter 3455:
1.163 dwinter 3456: def changeWeights(self):
1.236 dwinter 3457: """change form"""
3458: pt=zptFile(self, 'zpt/changeWeightForm')
3459: pt.content_type="text/html"
3460: return pt()
1.264 dwinter 3461:
1.153 dwinter 3462:
3463: def reloadMetaDataFromStorageWarning(self,RESPONSE=None):
1.236 dwinter 3464: """warning"""
3465: pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt')
1.153 dwinter 3466: pt.content_type="text/html"
3467: return pt()
3468:
3469: def reloadMetaDataFromStorage(self,RESPONSE=None):
1.236 dwinter 3470: """reload MD from Storage"""
1.153 dwinter 3471:
1.236 dwinter 3472: return reloadMetaDataFromStorage(self,RESPONSE)
1.153 dwinter 3473:
1.143 dwinter 3474: def getRDF(self,urn=None):
1.236 dwinter 3475: """rdf of the collection"""
1.143 dwinter 3476:
1.236 dwinter 3477: contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection'])
1.141 dwinter 3478:
1.236 dwinter 3479: ret=getRDFDescription(self,self.absolute_url(),urn=urn)
3480:
3481: li="""<RDF:li RDF:resource="%s" />\n"""
3482:
3483:
3484: for content in contents:
3485: ret+=content[1].getRDF()+"\n"
3486:
3487: ret+="""<RDF:Seq RDF:about="%s">\n"""%urn
3488: for content in contents:
3489: nurn=content[1].absolute_url()
3490: ret+=li%nurn
3491: return ret+"</RDF:Seq>"
3492:
1.90 dwinter 3493:
1.130 dwinter 3494: def showContent(self,path):
1.236 dwinter 3495: """return content/html"""
3496:
3497: return ECHO_helpers.urlopen(path+"/content_html").read()
1.130 dwinter 3498:
3499: def getImageViewers(self):
3500: """images"""
3501: viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])
3502: return viewers
3503:
1.90 dwinter 3504:
3505: def getBibTag(self,tag,content):
1.236 dwinter 3506: """get field tag for index-meta-generation"""
3507: if not content or content=="":
3508: return ""
3509: ret="<%s>"%tag
3510: #ret+=urllib.quote(content)
3511: ret+=content
1.95 dwinter 3512:
1.236 dwinter 3513: ret+="</%s>"%tag
3514: return ret
1.90 dwinter 3515:
3516: def getValueFromClass(self,field,found):
1.260 dwinter 3517: """ret attribute if existing"""
1.236 dwinter 3518: try:
3519:
3520: return getattr(found,field).decode('ascii','ignore')
3521: except:
3522: return ""
1.210 dwinter 3523:
3524: security.declarePublic('getImageTag')
1.49 dwinter 3525: def getImageTag(self):
1.236 dwinter 3526: """needed by main_template"""
3527: return ""
1.210 dwinter 3528:
1.49 dwinter 3529: secondaryLink="" #needed by main_template
3530: secondaryLinkTitle="" #needed by main_template
3531:
1.35 dwinter 3532: def getBgcolour(self):
1.236 dwinter 3533: """hack"""
3534: return "#dddddd"
1.28 dwinter 3535:
1.217 dwinter 3536: security.declareProtected('View','contentTypeSelector_HTML')
1.28 dwinter 3537: def contentTypeSelector_HTML(self,selected=None):
3538: """give type selector"""
3539: if not selected:
3540: retStr="<option selected>\n"
3541: else:
3542: retStr="<option>\n"
3543:
1.62 dwinter 3544: try: # erste version contentTypes exists
1.73 dwinter 3545: for contentType in self.ZopeFind(self.contentTypes,obj_metatypes=["ECHO_contentType","OSAS_MetadataMapping"]):
1.28 dwinter 3546: if selected and (contentType[0]==selected):
3547: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
3548: else:
3549: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
3550: except:
1.236 dwinter 3551: try:
3552: for contentType in self.ZopeFind(self.standardMD,obj_metatypes=["OSAS_MetadataMapping"]):
3553: if selected and (contentType[0]==selected):
3554: retStr+="""<option selected value="%s">%s\n"""%(contentType[0],contentType[0])
3555: else:
3556: retStr+="""<option value="%s">%s\n"""%(contentType[0],contentType[0])
3557: except:
3558: """nothing"""
3559:
3560: return retStr
1.73 dwinter 3561:
3562: def renderingTypeSelector_HTML(self,selected=None):
3563: """give type selector"""
1.236 dwinter 3564: if not selected:
3565: retStr="<option selected>\n"
3566: else:
3567: retStr="<option>\n"
3568:
3569: try: # erste version renderingTypes exists
3570: for renderingType in self.ZopeFind(self.renderingTypes,obj_metatypes=["ECHO_renderingType"]):
3571: if selected and (renderingType[0]==selected):
3572: retStr+="""<option selected value="%s">%s\n"""%(renderingType[0],renderingType[0])
3573: else:
3574: retStr+="""<option value="%s">%s\n"""%(renderingType[0],renderingType[0])
3575: except:
3576: """nothing"""
3577: return retStr
1.73 dwinter 3578:
3579:
1.151 jdamerow 3580: def copyrightTypeSelector_HTML(self, object=None, selected=None,first=None):
1.73 dwinter 3581: """give type selector"""
1.104 dwinter 3582:
1.236 dwinter 3583: if not first:
3584: if not selected:
3585: retStr="<option selected>\n"
3586: else:
3587: retStr="<option>\n"
3588: else:
3589: if not selected:
3590: retStr="""<option selected value="%s">%s\n"""%first
3591: else:
3592: retStr="""<option value="%s">%s\n"""%first
3593:
3594:
3595: try: # erste version copyrightTypes exists
3596: for copyrightType in self.ZopeFind(self.copyrightTypes,obj_metatypes=["ECHO_copyrightType"]):
3597: if selected and (copyrightType[0]==selected):
3598: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
3599: else:
3600: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
3601:
3602: for copyrightTypeSelf in self.ZopeFind(object,obj_metatypes=["ECHO_copyrightType"],search_sub=1):
3603: if selected and (copyrightTypeSelf[0]==selected):
3604: retStr+="""<option selected value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
3605: else:
3606: retStr+="""<option value="%s">%s\n"""%(copyrightTypeSelf[0],copyrightTypeSelf[0])
3607:
3608: except:
3609: """nothing"""
3610:
3611: return retStr
1.98 dwinter 3612:
3613: def partnerSelector_HTML(self,selected=None):
3614: """give type selector"""
1.236 dwinter 3615: if not selected:
3616: retStr="<option selected>\n"
3617: else:
3618: retStr="<option>\n"
3619:
3620: try: # erste version copyrightTypes exists
3621: for copyrightType in self.ZopeFind(self.partners,obj_metatypes=["ECHO_partner"]):
3622: if selected and (copyrightType[0]==selected):
3623: retStr+="""<option selected value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
3624: else:
3625: retStr+="""<option value="%s">%s\n"""%(copyrightType[0],copyrightType[0])
3626: except:
3627: """nothing"""
3628: return retStr
1.98 dwinter 3629:
1.195 casties 3630: mediaTypes=['all','text','images','sound','video'] # konfigurierbar in neuer version ueber echoroot??
1.98 dwinter 3631:
3632: def mediaTypeSelector_HTML(self,selected=None):
3633: """give type selector"""
1.236 dwinter 3634: if not selected:
3635: retStr="<option selected>\n"
3636: else:
3637: retStr="<option>\n"
3638:
3639: try: # erste version mediatypesTypes exists
3640: for mediaType in self.mediaTypes:
3641: if selected and (mediaType in selected):
3642: retStr+="""<option selected value="%s">%s\n"""%(mediaType,mediaType)
3643: else:
3644: retStr+="""<option value="%s">%s\n"""%(mediaType,mediaType)
3645: except:
3646: """nothing"""
3647: return retStr
1.73 dwinter 3648:
1.28 dwinter 3649:
1.27 dwinter 3650: def patchContentType(self,obj=None):
3651: """austauschen content_type with contentType (patch bei umstieg von alter Version)"""
3652:
3653:
3654: if not obj:
3655: obj = self
3656:
1.30 dwinter 3657: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_externalLink','ECHO_pageTemplate'])
1.27 dwinter 3658:
3659: for entry in entries:
1.31 dwinter 3660: setattr(entry[1],'contentType',entry[1].content_type)
3661: #entry[1].contentType == entry[1].content_type
1.27 dwinter 3662:
3663: if entry[1].meta_type == 'ECHO_collection':
3664: entry[1].patchContentType(entry[1])
1.19 dwinter 3665:
1.27 dwinter 3666:
1.49 dwinter 3667: return "changed all contenttypes in: "+self.title
1.63 dwinter 3668:
3669:
1.198 casties 3670: def repairAllCoords(self):
1.236 dwinter 3671: """updates map coordinates on the same and sublevels"""
3672: return repairCoords(self)
1.198 casties 3673:
3674:
1.63 dwinter 3675: def patchViewClassification(self,obj=None):
3676: """setze viewClassification heuristisch"""
3677:
1.236 dwinter 3678: def checkIfArrow(obj):
3679: if hasattr(obj,'coords'):
3680: for coordtemp in obj.coords:
3681:
3682: if (len(coordtemp)>4) and not (coordtemp[4]==''):
3683: return 4
3684: return None
3685: return None
3686:
1.63 dwinter 3687: if not obj:
3688: obj = self
3689:
3690: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection','ECHO_group'])
3691:
3692: for entry in entries:
1.236 dwinter 3693:
3694: if checkIfArrow(entry[1]):
3695: setattr(entry[1],'viewClassification','view point')
3696: else:
3697: setattr(entry[1],'viewClassification','area')
1.63 dwinter 3698:
3699: #entry[1].contentType == entry[1].content_type
3700:
3701: if entry[1].meta_type in ['ECHO_collection','ECHO_group']:
3702: entry[1].patchViewClassification(entry[1])
3703:
3704:
3705: return "changed all contenttypes in: "+self.title
1.166 dwinter 3706:
1.167 dwinter 3707: def deleteCache(self,obj=None,RESPONSE=None):
1.166 dwinter 3708: """setze alle collections auf cache = CacheManager"""
3709: if not obj:
3710: obj = self
1.167 dwinter 3711: entries=obj.ZopeFind(obj,search_sub=1)
1.166 dwinter 3712: for entry in entries:
1.236 dwinter 3713: if hasattr(entry[1],'_v_hash'):
3714: entry[1]._v_hash=None
1.166 dwinter 3715:
3716: return "changed all CM in: "+self.title
1.167 dwinter 3717:
1.166 dwinter 3718:
1.195 casties 3719: security.declarePublic('ECHO_newViewerLink')
1.19 dwinter 3720: def ECHO_newViewerLink(self,obj=None):
3721: """change links (:86 faellt weg)"""
3722:
3723: if not obj:
3724: obj = self
3725:
3726: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_resource','ECHO_collection'])
3727:
3728: for entry in entries:
3729:
3730: if entry[1].meta_type == 'ECHO_resource':
3731:
3732: entry[1].link=re.sub('\:86','',entry[1].link)
3733:
3734: else:
3735:
3736: entry[1].ECHO_newViewerLink(entry[1])
3737:
3738: return "Rerenderd all links to resources in: "+self.title
1.1 casties 3739:
3740: def __init__(self,id,title):
3741: """init"""
3742: self.id = id
3743: self.title=title
1.13 dwinter 3744:
1.14 dwinter 3745: def deleteSpace(self,str):
3746: """delete space at the end of a line"""
3747: if str[len(str)-1]==" ":
3748: return str[0:len(str)-1]
3749: else:
3750: return str
3751:
3752:
3753:
3754: # zusaetliche methoden fuer das vlp muessen in ein eigenes produkt
3755:
3756: def formatAscii(self,str,url=None):
3757: """ersetze ascii umbrueche durch <br>"""
1.291 casties 3758:
3759: if not str:
3760: return ""
3761:
1.14 dwinter 3762: if url:
3763:
3764: retStr=""
3765: words=str.split("\n")
3766:
3767: for word in words:
3768: strUrl=url%word
1.91 dwinter 3769:
1.14 dwinter 3770: retStr+="""<a href="%s">%s</a><br/>"""%(strUrl,word)
3771: str=retStr
3772: if str:
1.291 casties 3773: str = re.sub(r"[\n]","<br/>",str)
3774: return unicodify(str)
1.14 dwinter 3775: else:
1.291 casties 3776: return u""
1.14 dwinter 3777:
1.239 dwinter 3778: link2html=vlp_xmlhelpers.link2html
1.278 casties 3779: related2html=vlp_xmlhelpers.related2html
1.91 dwinter 3780:
1.239 dwinter 3781: xml2html=vlp_xmlhelpers.xml2html
3782:
3783: checkRef=vlp_xmlhelpers.checkRef
3784:
3785: # def checkRef(self,ref):
3786: # if ref[0:3]=='lit':
3787: # if len(self.library_data({ 'id':ref}))>0:
3788: # return 1
3789: # try:
3790: # if ref[0:7]=="tec_cat":
3791: # return 1
3792: # except:
3793: # """nothing"""
3794: #
3795: # dbs={'vl_technology':'','vl_people':" AND complete='yes'",'vl_sites':''}
3796: # res=None
3797: # for db in dbs.keys():
3798: # res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db])))
3799: # return res
3800: #
3801: # #Ende Methode fuer vlp
1.14 dwinter 3802:
1.13 dwinter 3803: def PgQuoteString(self,string):
3804: """Quote string"""
1.91 dwinter 3805:
1.13 dwinter 3806: return libpq.PgQuoteString(string)
1.217 dwinter 3807:
3808: security.declareProtected('View','getPartners')
1.1 casties 3809: def getPartners(self):
3810: """Get list of Partners. Presently only from a subfolder partners"""
1.236 dwinter 3811: if hasattr(self,'partners'):
1.272 dwinter 3812: ret = [ item[1] for item in self.partners.ZopeFind(self.partners,obj_metatypes=['ECHO_partner'])]
3813: def sort_title(one, another) : return cmp(one.title, another.title)
3814: ret.sort(sort_title)
3815: return ret
1.236 dwinter 3816: else:
3817: return []
1.157 jdamerow 3818:
3819: def getInstitutions(self):
3820: """Get list of Partners. Presently only from a subfolder partners"""
3821:
3822: return [ item[1] for item in self.institutions.ZopeFind(self.institutions,obj_metatypes=['ECHO_institution'])]
1.1 casties 3823:
1.157 jdamerow 3824:
1.26 dwinter 3825: def getPartnersXML(self):
3826: """partner liste als xml"""
3827: partners=self.getPartners()
1.60 dwinter 3828: ret="""<?xml version="1.0" encoding="utf-8" ?>
1.236 dwinter 3829: <partners>"""
1.60 dwinter 3830:
1.236 dwinter 3831: for partner in partners:
1.172 dwinter 3832: ret+="""<partner id="%s" title="%s"/>\n"""%(partner.getId(),partner.title)
1.26 dwinter 3833:
3834: return ret+"\n</partners>"
1.24 dwinter 3835:
1.1 casties 3836: def getCollectionTree(self):
3837: """get the collection tree (list of triples (parent,child, depth)"""
3838:
3839: def getCollection(object,depth=0):
3840: depth+=1
3841: collections=[]
3842: for entry in object.__dict__.keys():
3843: element=getattr(object,entry)
3844: try:
3845: if element.meta_type=="ECHO_collection":
3846: collections.append((object,element,depth))
3847: collections+=getCollection(element,depth)
3848: except:
3849: """nothing"""
3850: return collections
3851:
3852:
3853: return getCollection(self)
3854:
3855: def getCollectionTreeIds(self):
3856: """Show the IDs of the Tree"""
3857: ret=[]
3858: for collection in self.getCollectionTree():
3859: ret.append((collection[0].getId(),collection[1].getId(),collection[2]))
3860: return ret
3861:
1.82 dwinter 3862: def getResourcesHTML(self,viewerType=None,filter=None):
1.236 dwinter 3863: """gebe all ressourcen aus"""
1.81 dwinter 3864:
1.236 dwinter 3865: def sortHTML(x,y):
3866: return cmp(x[1].title,y[1].title)
3867:
3868: ret="""<html><body><h2>Resources in ECHO</h3>"""
3869:
3870: resources = self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1)
3871: ret+="""<h3>Found %i resources</h3>"""%len(resources)
3872: resources.sort(sortHTML)
3873: for resource in resources:
3874: echo_url=resource[1].absolute_url()
3875:
3876: if hasattr(resource[1],'title'):
3877: title=resource[1].title
3878: else:
3879: title="None"
3880: if filter:
3881: if re.search(filter,title):
3882: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
3883: else:
3884: ret+="""\n<p><a href="%s">%s</a></p>"""%(echo_url,title)
3885:
3886: ret +="""\n</body></html>"""
3887:
3888: #self.REQUEST.RESPONSE.setHeader("Content-Type", "text/html")
3889: #self.REQUEST.RESPONSE.write(ret)
3890: return ret
1.82 dwinter 3891:
1.81 dwinter 3892: def getResourcesXML(self,viewerType=None,filter=None):
1.236 dwinter 3893: """gebe all ressourcen aus"""
3894: ret="""<?xml version="1.0" ?>
3895: <index>"""
3896: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3897:
3898: echo_url=resource[1].absolute_url()
3899: if hasattr(resource[1],'link'):
3900: viewer_url=resource[1].link
3901: else:
3902: viewer_url="NO URL"
3903: if filter:
3904: if re.search(filter,viewer_url):
3905: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3906: else:
3907: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3908: ret +="""\n</index>"""
3909:
3910: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3911: self.REQUEST.RESPONSE.write(ret)
1.83 dwinter 3912:
3913: def getFullTextsXML(self,viewerType=None,filter=None):
1.236 dwinter 3914: """gebe all ressourcen aus"""
3915: ret="""<?xml version="1.0" ?>
3916: <index>"""
3917: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3918:
3919: echo_url=resource[1].absolute_url()
3920: if resource[1].getFullTextXML(noredirect="yes"):
3921: if hasattr(resource[1],'link'):
3922: viewer_url=echo_url+"/getFullTextXML"
3923: else:
3924: viewer_url="NO URL"
3925: if filter:
3926: if re.search(filter,viewer_url):
3927: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3928: else:
3929: ret+="""\n<resource echoLink="%s" viewerLink="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(viewer_url,safe='/:?'))
3930: ret +="""\n</index>"""
3931:
3932:
3933: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3934: self.REQUEST.RESPONSE.write(ret)
1.108 dwinter 3935:
3936:
1.109 dwinter 3937: def getMetaDatasXML(self,viewerType=None,filter=None):
1.236 dwinter 3938: """gebe all ressourcen aus"""
3939: # check if the request's host part was OK
3940: http_host = self.REQUEST['HTTP_HOST']
3941: host_port = self.REQUEST['SERVER_PORT']
3942: fix_host = None
3943: if http_host and http_host.rfind(host_port) == -1:
3944: print "HTTP_HOST needs fixing!"
3945: fix_host = http_host + ":" + host_port
3946:
3947: ret="""<?xml version="1.0" ?>
3948: <index>"""
3949: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
3950:
3951: echo_url=resource[1].absolute_url()
3952: if fix_host:
3953: #print "replacing ", http_host, " by ", fix_host
3954: echo_url = string.replace(echo_url, http_host, fix_host, 1)
3955:
3956: if hasattr(resource[1],'link'):
3957: meta_url=echo_url+"/getMetaDataXML"
3958: else:
3959: meta_url="NO_URL"
3960:
3961: if filter and not re.search(filter,viewer_url):
3962: continue
3963:
3964: #modificationDate=time.strptime(str(resource[1].bobobase_modification_time()),"%Y/%m/%d %H:%M:%S %Z")
3965:
3966: modificationDate=resource[1].bobobase_modification_time().strftime("%Y/%m/%d %H:%M:%S")
3967:
3968: ret+="""\n<resource resourceLink="%s" metaLink="%s" modificationDate="%s"/>"""%(urllib.quote(echo_url,safe='/:?'),urllib.quote(meta_url,safe='/:?'),modificationDate)
3969:
3970:
3971: ret +="""\n</index>"""
1.170 casties 3972:
1.236 dwinter 3973: self.REQUEST.RESPONSE.setHeader("Content-Type", "text/xml")
3974: self.REQUEST.RESPONSE.write(ret)
1.108 dwinter 3975:
1.236 dwinter 3976:
3977: def findPartners(self):
1.106 jdamerow 3978: """find all partners in partners"""
1.107 jdamerow 3979: par=self.ZopeFind(self.partners, obj_metatypes='ECHO_partner')
1.106 jdamerow 3980: return par
1.114 jdamerow 3981:
3982: def getPartnerFromID(self):
3983: """find partner form ID return object"""
1.115 jdamerow 3984: pa=self.REQUEST['partner']
1.116 jdamerow 3985: par=self.ZopeFind(self.partners, obj_ids=[pa])
1.114 jdamerow 3986: return par
1.117 jdamerow 3987:
3988: def getPartnerFromIDParameter(self, id):
3989: """ find partners from ID"""
3990: par=self.ZopeFind(self.partners, obj_ids=[id])
3991: return par
1.157 jdamerow 3992:
3993: def getInstitutionFromID(self,id):
3994: """ find institution from id """
3995: inst=self.ZopeFind(self.institutions, obj_ids=[id])
3996: return inst
1.108 dwinter 3997:
1.264 dwinter 3998: def updateResourceCatalog(self,REQUEST,RESPONSE):
3999: """update ressource catalog"""
4000: catalog=getattr(self,'resourceCatalog',None)
4001: if not catalog:
4002: return """<html><body><h3>No resourceCatalog available</h3></body></html>"""
4003:
4004: else:
1.267 dwinter 4005: class element:
4006: def __init__(self,group,name):
4007: self.group=group
4008: self.name=name
4009: catalog.manage_delObjects('author splitter')
4010: #elements=[element('Stop Words',""" Don't remove stop words' """),element('Word Splitter','ECHO author splitter')]
4011: elements=[element('Word Splitter','ECHO author splitter')]
4012: manage_addLexicon(catalog,id="author splitter",elements=elements)
4013:
1.264 dwinter 4014: return catalog.manage_catalogReindex(REQUEST,RESPONSE,'manage_main')
4015:
4016:
1.265 dwinter 4017: def checkMetaDataLinks(self,correct=None):
4018: """check all metadatalinks and if correct is set change the servername to content.mpiwg-berlin.mpg.de"""
4019:
4020: self.REQUEST.RESPONSE.write("<html><body>")
4021: for resource in self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1):
4022: metalink=resource[1].metalink
1.1 casties 4023:
1.265 dwinter 4024: try:
4025: url=urllib.urlopen(metalink)
4026: except:
4027:
4028: self.REQUEST.RESPONSE.write("<p>ERROR (opening %s):"%resource[1].absolute_url() +" -- %s %s <br>"%sys.exc_info()[0:2])
4029: self.REQUEST.RESPONSE.write("-----------%s"%metalink)
4030:
4031: if correct:
4032: urlparsed=[x for x in urlparse.urlparse(metalink)]
4033: urlparsed[1]="content.mpiwg-berlin.mpg.de"
4034: neu=urlparse.urlunparse(urlparsed)
4035: resource[1].metalink=neu[0:]
4036: self.REQUEST.RESPONSE.write("----------changed to:%s)"%neu)
4037:
1.13 dwinter 4038: def manage_addECHO_root(self,id,title,RESPONSE=None):
1.1 casties 4039: """Add an ECHO_root"""
4040: self._setObject(id,ECHO_root(id,title))
4041:
4042: if RESPONSE is not None:
4043: RESPONSE.redirect('manage_main')
4044:
1.13 dwinter 4045: def manage_addECHO_rootForm(self):
1.1 casties 4046: """Nothing yet"""
1.195 casties 4047: pt=zptFile(self, 'zpt/AddECHO_root.zpt')
1.1 casties 4048: return pt()
1.93 dwinter 4049:
1.189 dwinter 4050: class ECHO_copyrightType(Folder,ECHO_basis):
1.236 dwinter 4051: """copyright typ"""
1.93 dwinter 4052:
1.236 dwinter 4053: meta_type="ECHO_copyrightType"
4054:
4055: def __init__(self,id,title,label,url):
4056: """init"""
4057: self.id=id
4058: self.title=title
4059: self.label=label
4060: self.url=url
1.93 dwinter 4061:
1.236 dwinter 4062: manage_options = Folder.manage_options+(
1.93 dwinter 4063: {'label':'Main Config','action':'ECHO_copyrightType_config_mainForm'},
1.236 dwinter 4064: )
1.93 dwinter 4065:
1.236 dwinter 4066: def ECHO_copyrightType_config_mainForm(self):
4067: """change form"""
4068: pt=zptFile(self, 'zpt/ChangeECHO_copyrightType')
4069: pt.content_type="text/html"
4070: return pt()
4071:
4072: def ECHO_copyrightType_config_main(self,title,label,url,RESPONSE=None):
4073: """change"""
4074: self.title=title
4075: self.label=label
4076: self.url=url
1.93 dwinter 4077:
1.236 dwinter 4078: if RESPONSE is not None:
4079: RESPONSE.redirect('manage_main')
1.93 dwinter 4080:
4081: def manage_addECHO_copyrightTypeForm(self):
4082: """Form for adding a ressource"""
1.195 casties 4083: pt=zptFile(self, 'zpt/AddECHO_copyrightTypeForm.zpt')
1.93 dwinter 4084: return pt()
4085:
4086:
1.119 jdamerow 4087: def manage_addECHO_copyrightType(self,id,title,label,url,RESPONSE=None):
1.93 dwinter 4088: """addaresource"""
4089:
1.119 jdamerow 4090: newObj=ECHO_copyrightType(id,title,label,url)
1.93 dwinter 4091:
4092: self._setObject(id,newObj)
4093:
4094: if RESPONSE is not None:
4095: RESPONSE.redirect('manage_main')
4096:
4097:
1.1 casties 4098:
4099:
1.189 dwinter 4100: class ECHO_linkList(ZopePageTemplate,ECHO_basis):
1.157 jdamerow 4101: """LinkList Objekt"""
4102: meta_type="ECHO_linkList"
4103:
4104: _default_content_fn = os.path.join(package_home(globals()), 'html/ECHO_pageTemplateDefault.html')
4105:
4106: manage_options = ZopePageTemplate.manage_options+(
4107: {'label':'Main Config','action':'changeECHO_linkListWeightForm'},
4108: )
4109:
4110: def content_html(self):
1.236 dwinter 4111: """content_html"""
4112: return ECHO_basis.content_html(self,'pageTemplate')
1.157 jdamerow 4113:
4114: def changeECHO_linkListWeightForm(self):
4115: """change"""
1.195 casties 4116: pt=zptFile(self, 'zpt/ChangeECHO_linkListTemplate.zpt')
1.157 jdamerow 4117: return pt()
4118:
4119: def changeECHO_linkListWeight(self,contentType,label,RESPONSE=None):
4120: """change"""
4121: self.contentType=contentType
4122: self.label=label
4123:
4124: if RESPONSE is not None:
4125: RESPONSE.redirect('manage_main')
4126:
4127: def getLabel(self):
4128: if hasattr(self,'label'):
4129: return self.label.encode('utf-8')
4130: else:
4131: return 0
4132:
4133: def getcontentType(self):
4134: """get contentType"""
4135: if hasattr(self,'contentType'):
1.277 dwinter 4136: return normalizeCt(self.contentType)
1.157 jdamerow 4137: else:
4138: return 0
4139:
4140: def __init__(self, id, label, title=None, text=None, contentType=None):
4141: self.id = str(id)
4142: self.title=title
4143: self.label=label
4144: self.ZBindings_edit(self._default_bindings)
4145: if text is None:
4146: text = ''
1.290 casties 4147: if content_type is None:
4148: content_type = self.content_type
1.157 jdamerow 4149: self.pt_edit(text, contentType)
4150:
4151:
4152:
4153:
4154: def manage_addECHO_linkListForm(self):
4155: """Form for adding"""
1.195 casties 4156: pt=zptFile(self, 'zpt/AddECHO_linkListTemplate.zpt')
1.157 jdamerow 4157: return pt()
4158:
4159:
4160: def manage_addECHO_linkList(self, id, label,contentType=0,title=None, text=None,
4161: REQUEST=None, submit=None):
4162: """Add a LinkList with optional file content."""
4163:
4164: id = str(id)
4165: if REQUEST is None:
4166: self._setObject(id, ECHO_linkList(id, label, text))
4167: ob = getattr(self, id)
4168: setattr(ob,'contentType',contentType)
4169: if title:
4170: ob.pt_setTitle(title)
4171: return ob
4172: else:
4173: file = REQUEST.form.get('file')
4174: headers = getattr(file, 'headers', None)
4175: if (headers is None) or (not file.filename):
4176: zpt = ECHO_linkList(id, file)
4177: else:
4178: zpt = ECHO_linkList(id, label,'', file, headers.get('contentType'))
4179:
4180: self._setObject(id, zpt)
4181: ob = getattr(self, id)
4182: if title:
4183: ob.pt_setTitle(title)
4184:
4185: try:
4186: u = self.DestinationURL()
4187: except AttributeError:
4188: u = REQUEST['URL1']
4189:
4190: if submit == " Add and Edit ":
1.195 casties 4191: u = "%s/%s" % (u, urllib.quote(id))
1.157 jdamerow 4192: REQUEST.RESPONSE.redirect(u+'/manage_main')
4193: return ''
4194:
4195:
1.189 dwinter 4196: class ECHO_support(Folder,ECHO_basis):
1.236 dwinter 4197: """gefoerdert durch"""
4198: meta_type="ECHO_support"
4199:
4200:
4201:
4202: def __init__(self,id,institutions=None):
4203: """init"""
4204: self.id=id
4205: self.title=''
4206: self.institutions=toList(institutions)
4207:
4208: def getSupporter(self):
4209: """return institutions"""
4210: if self.institutions:
4211: return self.institutions
4212: else:
4213: return []
4214:
4215: manage_options = Folder.manage_options+(
4216: {'label':'Main Config','action':'ECHO_support_configForm'},
4217: )
4218:
4219: def ECHO_support_configForm(self):
4220: """change form"""
4221: pt=zptFile(self, 'zpt/ChangeECHO_support')
4222: pt.content_type="text/html"
4223: return pt()
4224:
4225: def ECHO_support_config(self,institutions=None,RESPONSE=None):
4226: """change"""
4227: self.institutions=toList(institutions)
1.157 jdamerow 4228:
1.236 dwinter 4229: if RESPONSE is not None:
4230: RESPONSE.redirect('manage_main')
1.157 jdamerow 4231:
1.236 dwinter 4232:
1.157 jdamerow 4233: def manage_addECHO_supportForm(self):
4234: """Form for adding"""
1.195 casties 4235: pt=zptFile(self, 'zpt/AddECHO_support.zpt')
1.157 jdamerow 4236: return pt()
4237:
1.159 jdamerow 4238: def manage_addECHO_support(self, id,institutions=None,RESPONSE=None):
1.236 dwinter 4239: """add the copyright"""
1.157 jdamerow 4240:
1.236 dwinter 4241: meta_type="ECHO_support"
4242:
4243:
4244: self._setObject(id, ECHO_support(id,institutions))
4245:
4246: if RESPONSE is not None:
4247: RESPONSE.redirect('manage_main')
4248:
1.272 dwinter 4249: # ECHO - owner of original
4250: class ECHO_ownerOriginal(Folder,ECHO_basis):
4251: """besitzer des originals"""
4252: meta_type="ECHO_ownerOriginal"
4253: security=ClassSecurityInfo()
4254:
4255:
4256: def __init__(self,id,institutions=None):
4257: """init"""
4258: self.id=id
4259: self.title=''
4260: self.institutions=toList(institutions)
4261:
4262: security.declarePublic('getOwner')
4263: def getOwner(self):
4264: """return institutions"""
4265: if self.institutions:
4266: return self.institutions
4267: else:
4268: return []
4269:
4270: manage_options = Folder.manage_options+(
4271: {'label':'Main Config','action':'ECHO_ownerOriginal_configForm'},
4272: )
4273:
4274: def ECHO_ownerOriginal_configForm(self):
4275: """change form"""
4276: pt=zptFile(self, 'zpt/ChangeECHO_ownerOriginal')
4277: pt.content_type="text/html"
4278: return pt()
4279:
4280: def ECHO_ownerOriginal_config(self,institutions=None,RESPONSE=None):
4281: """change"""
4282: self.institutions=toList(institutions)
4283:
4284: if RESPONSE is not None:
4285: RESPONSE.redirect('manage_main')
4286:
4287:
4288: def manage_addECHO_ownerOriginalForm(self):
4289: """Form for adding"""
4290: pt=zptFile(self, 'zpt/AddECHO_ownerOriginal.zpt')
4291: return pt()
4292:
4293: def manage_addECHO_ownerOriginal(self, id,institutions=None,RESPONSE=None):
4294: """add the copyright"""
4295:
4296: meta_type="ECHO_ownerOriginal"
4297:
4298:
4299: self._setObject(id, ECHO_ownerOriginal(id,institutions))
4300:
4301: if RESPONSE is not None:
4302: RESPONSE.redirect('manage_main')
4303:
4304: # --------------------------------------------------------------------------------
4305:
4306: # ECHO - digitized copy by
4307: class ECHO_digiCopyBy(Folder,ECHO_basis):
4308: """besitzer des originals"""
4309: meta_type="ECHO_digiCopyBy"
4310: security=ClassSecurityInfo()
4311:
4312:
4313: def __init__(self,id,institutions=None):
4314: """init"""
4315: self.id=id
4316: self.title=''
4317: self.institutions=toList(institutions)
4318:
4319: security.declarePublic('getDigiCopyBy')
4320: def getDigiCopyBy(self):
4321: """return institutions"""
4322: if self.institutions:
4323: return self.institutions
4324: else:
4325: return []
4326:
4327: manage_options = Folder.manage_options+(
4328: {'label':'Main Config','action':'ECHO_digiCopyBy_configForm'},
4329: )
4330:
4331: def ECHO_digiCopyBy_configForm(self):
4332: """change form"""
4333: pt=zptFile(self, 'zpt/ChangeECHO_digiCopyBy')
4334: pt.content_type="text/html"
4335: return pt()
4336:
4337: def ECHO_digiCopyBy_config(self,institutions=None,RESPONSE=None):
4338: """change"""
4339: self.institutions=toList(institutions)
4340:
4341: if RESPONSE is not None:
4342: RESPONSE.redirect('manage_main')
4343:
4344:
4345: def manage_addECHO_digiCopyByForm(self):
4346: """Form for adding"""
4347: pt=zptFile(self, 'zpt/AddECHO_digiCopyBy.zpt')
4348: return pt()
4349:
4350: def manage_addECHO_digiCopyBy(self, id,institutions=None,RESPONSE=None):
4351: """add the copyright"""
4352:
4353: meta_type="ECHO_digiCopyBy"
4354:
4355:
4356: self._setObject(id, ECHO_digiCopyBy(id,institutions))
4357:
4358: if RESPONSE is not None:
4359: RESPONSE.redirect('manage_main')
4360:
4361: # --------------------------------------------------------------------------------
1.157 jdamerow 4362:
1.189 dwinter 4363: class ECHO_institution(Image,Persistent,ECHO_basis):
1.157 jdamerow 4364: """ECHO Institution"""
4365:
4366: meta_type="ECHO_institution"
4367:
4368: def __init__(self, id, title,url, file, person, email, country, content_type='', precondition=''):
4369: self.__name__=id
4370: self.title=title
4371: self.url=url
4372: self.person=person
4373: self.email=email
4374: self.country=country
4375: self.precondition=precondition
4376: data, size = self._read_data(file)
4377: content_type=self._get_content_type(file, data, id, content_type)
4378: self.update_data(data, content_type, size)
4379:
4380: manage_options = Image.manage_options+(
4381: {'label':'Institution Information','action':'ECHO_institution_config'},
4382: )
4383:
4384:
4385: def changeECHO_institution(self,url,person, email, country,RESPONSE=None):
4386: """Change main information"""
4387: self.url=url
4388: self.person=person
4389: self.email=email
4390: self.country=country
4391: if RESPONSE is not None:
4392: RESPONSE.redirect('manage_main')
4393:
4394:
4395:
4396: def ECHO_institution_config(self):
4397: """Main configuration"""
4398: if not hasattr(self,'url'):
4399: self.url=""
1.195 casties 4400: pt=zptFile(self, 'zpt/ChangeECHO_institution.zpt')
1.157 jdamerow 4401: return pt()
4402:
4403:
4404: manage_addECHO_institutionForm=DTMLFile('dtml/ECHO_institutionAdd',globals(),
4405: Kind='ECHO_institution',kind='ECHO_institution')
4406:
4407:
1.1 casties 4408:
1.157 jdamerow 4409: def manage_addECHO_institution(self, id, url, person, email, country, file=None, title='', precondition='', content_type='',
4410: REQUEST=None):
4411: """
4412: Add a new ECHO_institution object.
4413:
4414: Creates a new ECHO_institution object 'id' with the contents of 'file'.
4415: Based on Image.manage_addImage
4416: """
4417:
4418: id=str(id)
4419: title=str(title)
4420: content_type=str(content_type)
4421: precondition=str(precondition)
4422:
4423: id, title = OFS.Image.cookId(id, title, file)
4424:
4425: self=self.this()
4426:
4427: # First, we create the image without data:
4428: self._setObject(id, ECHO_institution(id,title,url,'', person, email, country, content_type, precondition))
4429:
4430: # Now we "upload" the data. By doing this in two steps, we
4431: # can use a database trick to make the upload more efficient.
4432: if file:
4433: self._getOb(id).manage_upload(file)
4434: if content_type:
4435: self._getOb(id).content_type=content_type
4436:
4437: if REQUEST is not None:
4438: try: url=self.DestinationURL()
4439: except: url=REQUEST['URL1']
4440: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
1.160 dwinter 4441: return id
1.188 dwinter 4442:
1.198 casties 4443: def repairCoords(self):
1.236 dwinter 4444: """updates map coordinates to new MapArea objects"""
4445: msg = ""
4446: for cols in self.ZopeFind(self, obj_metatypes=['ECHO_collection','ECHO_resource'], search_sub=1):
4447: col = cols[1]
4448: if not hasattr(col, 'coords'):
4449: continue
4450: print "fixing: ", col.id
4451: msg += "fixing: "+col.id+"\n"
4452: coords = col.coords
1.237 dwinter 4453: if len(coords) > 0:
1.236 dwinter 4454: # delete old MapAreas
4455: for areas in self.ZopeFind(col, obj_metatypes=['MapArea']):
4456: #area = areas[1]
4457: id = areas[0]
4458: print " deleting: ", id
4459: msg += " deleting: "+id+"\n"
4460: col._delObject(id)
4461: # add new MapAreas
4462: areacnt = 0
4463: for coord in coords:
4464: if len(coord) < 4:
4465: continue
4466: type = col.viewClassification
4467: if type == 'view point':
4468: type = 'arrow'
4469: if type is None:
4470: if len(coord) > 4:
4471: type = 'arrow'
4472: else:
4473: type = 'area'
4474: newid = "a%02d"%areacnt
4475: areacnt += 1
4476: area = MapArea(newid, coord, type=type)
4477: print " adding: ", newid
4478: msg += " adding: "+newid+"\n"
4479: col.addMapArea(area)
4480: msg += "\nDone!"
4481: return msg
1.268 dwinter 4482:
4483: from ECHO_Nav import ECHO_navigation
4484:
4485: class ECHO_main(ECHO_root,ECHO_navigation):
4486: """echo main object combines ECHO_root and ECHO_navigation"""
4487:
4488: meta_type="ECHO_main"
4489:
4490: def __init__(self,id,title):
4491: """init"""
4492: self.id=id
4493: self.title=title
4494: self.pathToHierarchy="/"+self.id # hierarchie always starts with the object.
4495: self.displayedMetaTypes=displayTypes
4496:
4497:
4498: manage_options = Folder.manage_options+(
4499: {'label':'Main Config','action':'ECHO_navigationConfigForm'},
4500: {'label':'Cache','action':'ECHO_cacheManageForm'},
4501: {'label':'Main Config','action':'ECHO_copyright_configForm'},
4502: {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},
4503: {'label':'Change Weights','action':'changeWeights'},
4504: {'label':'Generate from RDF','action':'generateFromRDFForm'},
4505: {'label':'update Resource Catalog','action':'updateResourceCatalog'},
4506: {'label':'Copy MD for indexing and search','action':'copySearchFields'},
4507: )
4508:
4509:
4510: def manage_addECHO_mainForm(self):
4511: """Form for adding"""
4512: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_main.zpt')).__of__(self)
4513: return pt()
4514:
4515: def manage_addECHO_main(self,id,title,RESPONSE=None):
4516: """Add an ECHO_main"""
4517: self._setObject(id,ECHO_main(id,title))
4518:
4519: obj=self._getOb(id)
4520: text=file(os.path.join(package_home(globals()),'zpt','main_template')).read()
4521:
4522: manage_addPageTemplate(obj,'main_template',text=text)
4523:
4524:
4525: if RESPONSE is not None:
4526: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>