--- ECHO_content/ECHO_collection.py 2004/01/27 13:33:27 1.11 +++ ECHO_content/ECHO_collection.py 2011/11/03 11:05:25 1.311 @@ -1,4 +1,4 @@ - +"""New version of the produc started February, 8th. Without scientific classification, use content-type for further classification.""" """Echo collection provides the classes for the ECHO content web-site. class ECHO_collection is the basis class for an ECHO collection. @@ -9,346 +9,439 @@ class ECHO_externalLink contains informa """ +try: + from reportlab.pdfgen import canvas + from reportlab.lib.pagesizes import A4 +except: + print "PDF generation will not work" + +import urlparse import string +import tempfile +import zipfile +import re +import os,shutil import OFS.Image from types import * +from OFS.Cache import Cacheable from OFS.Image import Image from Globals import DTMLFile from OFS.Folder import Folder from OFS.SimpleItem import SimpleItem from AccessControl import ClassSecurityInfo +from AccessControl.User import UserFolder from Globals import InitializeClass from Globals import DTMLFile +import Globals from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate -from Globals import Persistent +from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate,manage_addPageTemplate +from Globals import Persistent, package_home from Acquisition import Implicit - - +from Products.ZCatalog.CatalogPathAwareness import CatalogAware +from Products.ZCTextIndex.ZCTextIndex import manage_addLexicon +try: + from Products.MetaDataProvider.MetaDataClient import MetaDataClient +except: + print "no metadataclient" import urllib +import urllib2 +import cgi +import smtplib +import time +from Ft.Xml.Domlette import NonvalidatingReader +from Ft.Xml.Domlette import PrettyPrint, Print +from Ft.Xml import EMPTY_NAMESPACE + +import Ft.Xml.XPath +import cStringIO + +import sys +import logging + +try: + from psycopg import libpq +except: + try: + from pyPgSQL import libpq + except: + print "ECHO_collection: Warning - No libpq imported!" + import xml.dom.minidom +import urllib +import xml.dom.minidom +import ECHO_helpers +from ECHO_helpers import * -#List of different types for the graphical linking viewer -viewClassificationListMaster=['view point','area'] - - -def toList(field): - """Einzelfeld in Liste umwandeln""" - if type(field)==StringType: - return [field] - else: - return field - -def getText(nodelist): - - rc = "" - for node in nodelist: - if node.nodeType == node.TEXT_NODE: - rc = rc + node.data - return rc - - -def readMetadata(url): - """Methoden zum Auslesen der Metadateninformation zu einer Resource - Vorerst noch Typ bib""" - - metadict={} - try: - geturl="" - for line in urllib.urlopen(url).readlines(): - geturl=geturl+line - - - except: - return (None,"Cannot open: "+url) - - try: - dom=xml.dom.minidom.parseString(geturl) - except: - return (None,"Cannot parse: "+url+"
"+geturl) - - metanode=dom.getElementsByTagName('bib') - metadict['bib_type']='Book' - if len(metanode)==0: - metanode=dom.getElementsByTagName('archimedes') - metadict['bib_type']='Archimedes' - #print "HELLO" - - if not len(metanode)==0: - metacontent=metanode[0].childNodes - - try: - metadict['bib_type']=getText(dom.getElementsByTagName('bib')[0].attributes['type'].childNodes) - except: - """nothing""" - - for node in metacontent: - try: - metadict[node.tagName.lower()]=getText(node.childNodes) - except: - """nothing""" +try: + from ECHO_language import * +except: + print "no echo_language" + class ECHO_language: + """ leere Klasse""" + pass + +from ECHO_movie import * +import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen +import xmlrpclib + +import logging + +#ersetzt logging.info +def logger(txt,method,txt2): + """logging""" + logging.info(txt+ txt2) - #print metadict - return metadict,"" - -def setECHO_CollectionInformation(self,context,science,practice,source_type,period,id,title,label,description,content_type,responsible,credits,weight,coordstrs,viewClassification=""): +def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""): """Allegemeine Informationen zu einer ECHO Collection""" - self.viewClassification=viewClassification - self.label = label self.title=title self.description=description - self.content_type=content_type + self.contentType=contentType self.responsible=responsible self.credits=toList(credits) self.weight=weight - self.scientific_Information.source_type=source_type - self.scientific_Information.period=period - self.scientific_Information.scientific_Classification.context=context - self.scientific_Information.scientific_Classification.science=science - self.scientific_Information.scientific_Classification.practice=practice - - coords=[] - #coordinates of for rectangles - - #print "cs", coordstrs - if coordstrs: - for coordstr in coordstrs: - print "cs", coordstr - try: - temco=coordstr.split(",") - except: - temco=[] - #temco.append(angle) - coords.append(temco) +import ECHO_resource +from ECHO_resource import manage_addECHO_resource +class ECHO_resource(ECHO_resource.ECHO_resource): + """depricated use class in ECHO_resource.py""" - self.coords=coords[0:] - -class scientificClassification(SimpleItem,Persistent,Implicit): - """subclass""" - security=ClassSecurityInfo() - - def __init__(self,context,science,practice): - self.context=context - self.science=science - self.practice=practice - self.id="scientific_Classification" - - security.declarePublic('get_context') - def get_context(self): - return self.context - - security.declarePublic('get_science') - def get_science(self): - return self.science - - security.declarePublic('get_practice') - def get_practice(self): - return self.practice - - -class scientificInformation(Folder,Persistent,Implicit): - """subclass scientificInformation""" - security=ClassSecurityInfo() - - +class ECHO_partner(Image,Persistent,ECHO_basis): + """ECHO Partner""" + + meta_type="ECHO_partner" + + def __init__(self, id, title,url, file, copyrightType, person, email, country, color, content_type='', precondition=''): + self.__name__=id + self.title=title + self.url=url + self.person=person + self.email=email + self.country=country + self.color=color + self.precondition=precondition + self.copyrightType=copyrightType + data, size = self._read_data(file) + content_type=self._get_content_type(file, data, id, content_type) + self.update_data(data, content_type, size) + + manage_options = Image.manage_options+( + {'label':'Partner Information','action':'ECHO_partner_config'}, + ) + - def __init__(self,source_type,period): + def changeECHO_partner(self,url,copyrightType,person, email, country, color, RESPONSE=None): + """Change main information""" + self.url=url + self.person=person + self.email=email + self.country=country + self.color=color + self.copyrightType=copyrightType + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + + def ECHO_partner_config(self): + """Main configuration""" + if not hasattr(self,'url'): + self.url="" + pt=zptFile(self, 'zpt/ChangeECHO_partner.zpt') + return pt() - self.id="scientific_Information" - self.source_type=source_type - self.period=period +manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(), + Kind='ECHO_partner',kind='ECHO_partner') - security.declarePublic('get_source_type') - def get_source_type(self): - return self.source_type - - security.declarePublic('get_period') - def get_period(self): - return self.period +def manage_addECHO_partner(self, id, url, person, email, country, color, file=None, copyrightType='', title='', precondition='', content_type='', + REQUEST=None): + """ + Add a new ECHO_partner object. -class ECHO_resource(Folder): - """ECHO Ressource""" - meta_type='ECHO_resource' + Creates a new ECHO_partner object 'id' with the contents of 'file'. + Based on Image.manage_addImage + """ - viewClassificationList=viewClassificationListMaster + id=str(id) + title=str(title) + content_type=str(content_type) + precondition=str(precondition) - def getViewClassification(self): - if hasattr(self,'viewClassification'): - return self.viewClassification - else: - return "" + id, title = OFS.Image.cookId(id, title, file) - def getCredits(self): - """Ausgabe der credits""" - if self.credits: - return self.credits - else: - return [] - - def __init__(self,id,link,metalink,title,label,description,content_type,responsible,credits,weight,coords): + self=self.this() - self.id = id - """Festlegen der ID""" - - self.label = label - self.link= link - self.metalink=metalink - self.title=title - self.weight=weight - self.credits=toList(credits) - self.description=description - self.content_type=content_type - self.responsible=responsible - - if coords: - coordsnew=[ string.split(x,",") for x in coords] - else: - coordsnew=[] - - self.coords=coordsnew + # First, we create the image without data: + self._setObject(id, ECHO_partner(id,title,url,'',copyrightType, person, email, country, color, content_type, precondition)) + # Now we "upload" the data. By doing this in two steps, we + # can use a database trick to make the upload more efficient. + if file: + self._getOb(id).manage_upload(file) + if content_type: + self._getOb(id).content_type=content_type - def getCoords(self): - try: - return [string.join(x,",") for x in self.coords] - except: - return [] + if REQUEST is not None: + try: url=self.DestinationURL() + except: url=REQUEST['URL1'] + REQUEST.RESPONSE.redirect('%s/manage_main' % url) + return id +class ECHO_locale(ZopePageTemplate): + """localisierung""" - def ECHO_resource_config(self): - """Main configuration""" + meta_type="ECHO_locale" - if not hasattr(self,'weight'): - self.weight="" - if not hasattr(self,'coords'): - self.coords=[] + def __init__(self,id,lang,title,label,text=None,content_type=None): + self.lang=lang + self.title=title + self.label=label + # default content + if not text: + text = open(self._default_content_fn).read() + content_type = 'text/html' + self.pt_edit(text, content_type) + self.id=id + + manage_options = ZopePageTemplate.manage_options+( + {'label':'Main Config','action':'change_ECHO_localeForm'}, + ) + + def change_ECHO_localeForm(self): + """change form""" + pt=zptFile(self, 'zpt/ChangeECHO_localeForm.zpt') + return pt() + + def change_ECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None): + """change echo locale""" + self.lang=lang + self.title=title + self.label=label + if not text is None: + if content_type is None: + content_type = self.content_type + self.pt_edit(text, content_type) - pt=PageTemplateFile('Products/ECHO_content/ChangeECHO_resource.zpt').__of__(self) - return pt() - + if RESPONSE is not None: + RESPONSE.redirect('manage_main') - def changeECHO_resource(self,metalink,link,context,science,practice,source_type,period,title,label,description,content_type,responsible,credits,weight,viewClassification="",coords="",RESPONSE=None): + +def manage_addECHO_localeForm(self): + """Form for adding""" + pt=zptFile(self, 'zpt/AddECHO_localeForm.zpt') + return pt() +def manage_addECHO_locale(self,lang,title,label,text=None,content_type=None,RESPONSE=None): + """add echo locale""" - """Änderung der Properties""" + id="locale_"+lang + self._setObject(id, ECHO_locale(id,lang,title,label,text,content_type)) + if RESPONSE is not None: + RESPONSE.redirect('manage_main') - setECHO_CollectionInformation(self,context,science,practice,source_type,period,id,title,label,description,content_type,responsible,credits,weight,coords,viewClassification) +class ECHO_copyright(Folder,ECHO_basis): + """Copyright informationen""" + meta_type="ECHO_copyright" - self.link=link - self.metalink=metalink - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - - manage_options = Folder.manage_options+( - {'label':'Main Config','action':'ECHO_resource_config'}, - {'label':'Metadata','action':'ECHO_getResourceMD'}, - {'label':'Graphics','action':'ECHO_graphicEntry'}, - ) + + def __init__(self,id,title,copyrights): + """init""" + self.title=title + self.id=id + self.copyrights=copyrights[0:] - def ECHO_graphicEntry(self): - """DO nothing""" - if 'overview' in self.aq_parent.__dict__.keys(): - pt=PageTemplateFile('Products/ECHO_content/ECHO_draw.zpt').__of__(self) - return pt() - else: - return "NO OVERVIEW GRAPHICS" + def getCopyrights(self): + """return coyprights""" + return self.copyrights + + manage_options = Folder.manage_options+( + {'label':'Main Config','action':'ECHO_copyright_configForm'}, + ) + + + def ECHO_copyright_configForm(self): + """change form""" + pt=zptFile(self, 'zpt/ChangeECHO_copyright') + pt.content_type="text/html" + return pt() + + def ECHO_copyright_config(self,title,RESPONSE=None): + """change""" + self.title=title + self.copyrights=[] + self.copyrights=getCopyrightsFromForm(self,self.REQUEST.form)[0:] + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + +def manage_addECHO_copyrightForm(self): + """Form for adding""" + pt=zptFile(self, 'zpt/AddECHO_copyright.zpt') + return pt() + +def manage_addECHO_copyright(self, id,title,RESPONSE=None): + """add the copyright""" - def ECHO_enterCoords(self,coordstr,angle="",RESPONSE=None): - """Enter coords""" - coords=self.coords - temco=coordstr.split(",") - temco.append(angle) - coords.append(temco) + meta_type="ECHO_copyright" - self.coords=coords[0:] - #pt=PageTemplateFile('Products/ECHO_content/ECHO_draw.zpt').__of__(self) + #first generate copyrights as list of tripels (mediaType,partner,copyrightType) + + + + self._setObject(id, ECHO_copyright(id, title,getCopyrightsFromForm(self,self.REQUEST.form))) + if RESPONSE is not None: - RESPONSE.redirect('ECHO_graphicEntry') + RESPONSE.redirect('manage_main') + +class ECHO_layoutTemplate(ZopePageTemplate,ECHO_basis): + """Create a layout Template for different purposes""" - def ECHO_getResourceMD(self,template="yes"): - """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource""" - (metadict, error)=readMetadata(self.metalink) + meta_type="ECHO_layoutTemplate" - #print "BLA" + def __init__(self, id, text=None, content_type=None,EchoType=None): + self.id = str(id) - if not error=="": #Fehler beim Auslesen des Metafiles - return "ERROR:",error - for key in metadict.keys():#Hinzufügen der Felder + self.ZBindings_edit(self._default_bindings) + if text is None: + self._default_content_fn = os.path.join(package_home(globals()),'zpt','ECHO_%s_template_standard.zpt'%EchoType) + text = open(self._default_content_fn).read() + if content_type is None: + content_type = self.content_type + self.pt_edit(text, content_type) - setattr(self,key,metadict[key].encode('ascii','replace')) - - self.metadata=metadict.keys() - #return "BLUccssB" - self.label=self.generate_label() - - if template=="yes": - pt=PageTemplateFile('Products/ECHO_content/ECHO_resourceMD.zpt').__of__(self) - return pt() - - def ECHO_getMD(self,item): - """Ausgabe der MD""" - return getattr(self,item) - - def index_html(self): - """standard page""" +def manage_addECHO_layoutTemplateForm(self): + """Form for adding""" + pt=zptFile(self, 'zpt/AddECHO_layoutTemplate.zpt') + return pt() + + +def manage_addECHO_layoutTemplate(self, EchoType,title=None,REQUEST=None): + "Add a Page Template with optional file content." + if type(EchoType)==StringType: + EchoTypes=[EchoType] + else: + EchoTypes=EchoType - return self.REQUEST.RESPONSE.redirect(self.link) + for singleType in EchoTypes: - def generate_label(self): - """Erzeugt_standard_Label aus Template""" - pt=getattr(self,"label_template_"+self.bib_type) - #return pt - #pt.content_type="text/html; charset=utf-8" - return pt() + id = str(singleType)+"_template" + if REQUEST is None: + self._setObject(id, ECHO_layoutTemplate(id, text,EchoType=singleType)) + ob = getattr(self, id) + + if title: + ob.pt_setTitle(title) + return ob + else: + file = REQUEST.form.get('file') + headers = getattr(file, 'headers', None) + if headers is None or not file.filename: + zpt = ECHO_layoutTemplate(id,EchoType=singleType) + else: + zpt = ECHO_layoutTemplate(id, file, headers.get('content_type')) -def manage_AddECHO_resourceForm(self): - """Nothing yet""" - pt=PageTemplateFile('Products/ECHO_content/AddECHO_resourceForm.zpt').__of__(self) - return pt() + self._setObject(id, zpt) + ob = getattr(self, id) + if title: + ob.pt_setTitle(title) + try: + u = self.DestinationURL() + except AttributeError: + u = REQUEST['URL1'] + + REQUEST.RESPONSE.redirect(u+'/manage_main') + return '' -def manage_AddECHO_resource(self,context,science,practice,source_type,period,id,title,label,description,content_type,responsible,link,metalink,credits,weight,coords=None,RESPONSE=None): +class ECHO_fullText(ZopePageTemplate,ECHO_basis,ECHO_language): + """echo fulltext in xml""" + meta_type="ECHO_fullText" - """nothing yet""" - scientificClassificationObj=scientificClassification(context,science,practice) - - scientificInformationObj=scientificInformation(source_type,period) - + + def getPage(self,nr='1'): + """get page n""" + #return self().encode('latin-1','ignore') + try: + dom=xml.dom.minidom.parseString(self()) + except: + dom=xml.dom.minidom.parseString(self.utf8ify(self())) + pages=dom.getElementsByTagName('page') + + return pages[int(nr)-1].toxml() + +# Product registration and Add support +manage_addECHO_fullTextForm = PageTemplateFile( + 'zpt/AddECHO_fullText.zpt', globals()) + +def manage_addECHO_fullText(self, id, title=None, text=None, + REQUEST=None, submit=None): + "Add a Page Template with optional file content." + + id = str(id) + if REQUEST is None: + self._setObject(id, ECHO_fullText(id, text)) + ob = getattr(self, id) + if title: + ob.pt_setTitle(title) + return ob + else: + file = REQUEST.form.get('file') + headers = getattr(file, 'headers', None) + if headers is None or not file.filename: + zpt = ECHO_fullText(id) + else: + zpt = ECHO_fullText(id, file, headers.get('content_type')) - newObj=ECHO_resource(id,link,metalink,title,label,description,content_type,responsible,credits,weight,coords) + self._setObject(id, zpt) - self._setObject(id,newObj) - getattr(self,id)._setObject('scientific_Information',scientificInformationObj) - getattr(self,id).scientific_Information._setObject('scientific_Classification',scientificClassificationObj) - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - + try: + u = self.DestinationURL() + except AttributeError: + u = REQUEST['URL1'] + + if submit == " Add and Edit ": + u = "%s/%s" % (u, urllib.quote(id)) + REQUEST.RESPONSE.redirect(u+'/manage_main') + return '' -class ECHO_externalLink(Folder): + + + +class ECHO_externalLink(Folder,ECHO_basis): """Link zu einer externen Ressource""" security=ClassSecurityInfo() meta_type='ECHO_externalLink' - - def __init__(self,id,link,title,label,description,content_type,responsible,credits,weight,coords): + security.declarePublic('content_html') + def content_html(self): + """template fuer content""" + ret= ECHO_basis.content_html(self,'externalLink') + + if type(ret) is StringType: + return ret.decode('utf-8') + else: + return ret + + + + def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords,linkType): self.id = id """Festlegen der ID""" @@ -359,10 +452,12 @@ class ECHO_externalLink(Folder): self.title=title self.weight=weight self.description=description - self.content_type=content_type + self.contentType=contentType self.responsible=responsible coordsnew=[ string.split(x,",") for x in coords] self.coords=coordsnew + self.linkType = linkType # Linktypen 'otherPresentation','external' + def ECHO_externalLink_config(self): """Main configuration""" @@ -372,68 +467,916 @@ class ECHO_externalLink(Folder): if not hasattr(self,'coords'): self.coords=[''] - print "G",self.coords - pt=PageTemplateFile('Products/ECHO_content/ChangeECHO_externalLink.zpt').__of__(self) + + pt=zptFile(self, 'zpt/ChangeECHO_externalLink.zpt') return pt() - def changeECHO_externalLink(self,link,context,science,practice,source_type,period,title,label,description,content_type,responsible,credits,weight,coords,RESPONSE=None): - - """Änderung der Properties""" - + def changeECHO_externalLink(self,link,title,label,description,contentType,responsible,weight,coords=None,credits=None,RESPONSE=None,linkType='otherPresentation'): + """Aenderung der Properties""" + setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight) - setECHO_CollectionInformation(self,context,science,practice,source_type,period,id,title,label,description,content_type,responsible,credits,weight,coords) - - self.link=link + self.linkType = linkType if RESPONSE is not None: RESPONSE.redirect('manage_main') + def getLinkType(self): + """ return linkType """ + if hasattr(self,"linkType"): + return self.linkType + else : + return 'otherPresentation' + + def setLinkType(self,type): + """ set linkType """ + self.linkType = type + + def checkLink(self): + """ returns tuple (isWorking,Error) """ + try: + urllib2.urlopen(self.link) + return (True, '') + except urllib2.HTTPError, e: + return (False, e.code) + except urllib2.URLError, e: + return (False, str(e.reason)) + except: + return (False, 'unknown Error') - manage_options = Folder.manage_options+( + + manage_options = ( {'label':'Main Config','action':'ECHO_externalLink_config'}, - ) - + {'label':'Graphic Coords','action':'ECHO_graphicEntry'}, + )+Folder.manage_options + + def index_html(self): """standard page""" return self.REQUEST.RESPONSE.redirect(self.link) + -def manage_AddECHO_externalLinkForm(self): - """Nothing yet""" - pt=PageTemplateFile('Products/ECHO_content/AddECHO_externalLinkForm.zpt').__of__(self) +def manage_addECHO_externalLinkForm(self): + """Form for external Links""" + pt=zptFile(self, 'zpt/AddECHO_externalLinkForm.zpt') return pt() -def manage_AddECHO_externalLink(self,context,science,practice,source_type,period,id,title,label,description,content_type,responsible,link,credits,weight,coords,RESPONSE=None): +def manage_addECHO_externalLink(self,id,title,label,description,contentType,responsible,link,weight,coords=None,credits=None,RESPONSE=None,linkType='otherPresentation'): + """Add an external Link""" - """nothing yet""" - scientificClassificationObj=scientificClassification(context,science,practice) - - scientificInformationObj=scientificInformation(source_type,period) + newObj=ECHO_externalLink(id,link,title,label,description,contentType,responsible,credits,weight,coords,linkType) + + self._setObject(id,newObj) + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + +class ECHO_link(ECHO_externalLink): + """external_link""" + + meta_type="ECHO_link" + + manage_options = ECHO_externalLink.manage_options+( + {'label':'add links config','action':'ECHO_link_addLinksForm'}, + ) + + def ECHO_link_addLinksForm(self): + """Main configuration""" + + pt=zptFile(self, 'zpt/ChangeECHO_link_addLinks.zpt') + return pt() + def ECHO_link_addLinks(self,addLinks,RESPONSE): + """add links""" + self.addLinks=addLinks + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + def content_html(self): + """template fuer link""" + + + if hasattr(self,"link_template"): + ret=ECHO_basis.content_html(self,'link') + + else: + ret=ECHO_basis.content_html(self,'collection') + + + #return ret + return ret +# +# +# try: +# return ret.decode('utf-8') +# except: +# try: +# return ret.decode('latin-1') +# except: +# +# return ret +# + def getCopyrightsHTML(self): + """gib (link auf copyright link, mediatyp, institution, copyrightType, label von copyrightType) aus""" + + if hasattr(self,'copyrightModel'): + obj=self.copyrightModel + + else: + return "ERROR" + ret=[] + + for copyright in obj.getCopyrights(): #copyright - media / partner / copyrightID + + + try: + if hasattr(self.copyrightTypes,copyright[2]): + copyrightTypeObj=getattr(self.copyrightTypes,copyright[2]) + link="copyrightTypes/"+copyright[2]+'/copyright.html' + else: + copyrightTypeObj=getattr(obj,copyright[2]) + link="copyrightModel/"+copyright[2]+'/copyright.html' + + label=copyrightTypeObj.label + url=getattr(copyrightTypeObj, 'url', '') + + if url!='': + ret.append((url,copyright[0],copyright[1],copyright[2],label)) + else: + if hasattr(copyrightTypeObj, 'copyright.html'): + ret.append(("""%s?partner=%s"""%(link,copyright[1]),copyright[0],copyright[1],copyright[2],label)) + else: + ret.append(('empty',copyright[0],copyright[1],copyright[2],label)) + except: + """nothing""" + + return ret + + def getInstitutionsHTML(self): + """gibt Liste der foerdernden Institutionen aus""" + + if hasattr(self,'support'): + obj=self.support + ret=obj.getSupporter() + return ret + else: + return '' + + def getOwnerOriginalsHTML(self): + """gibt Liste der foerdernden Institutionen aus""" + + if hasattr(self,'ownerOriginal'): + obj=self.ownerOriginal + ret=obj.getOwner() + return ret + else: + return '' + + def getDigiCopyByHTML(self): + """gibt Liste der foerdernden Institutionen aus""" + + if hasattr(self,'digiCopyBy'): + obj=self.digiCopyBy + ret=obj.getDigiCopyBy() + return ret + else: + return '' + + def index_html(self): + """standard link""" + if self.link: + splitted=self.link.split("?") + if len(splitted)>1: + params=cgi.parse_qs(splitted[1]) + + for x in params.keys(): + if type(params[x]) is ListType: + params[x]=params[x][0] + - newObj=ECHO_externalLink(id,link,title,label,description,content_type,responsible,credits,weight,coords) + else: + params={} + + if getattr(self,'addLinks','yes')=="yes": + params['backLink']=self.aq_parent.absolute_url() + params['startLink']=splitted[0]+"?"+urllib.urlencode(params) + + + return self.REQUEST.RESPONSE.redirect(splitted[0]+"?"+urllib.urlencode(params)) + else: + return "" + +def manage_addECHO_linkForm(self): + """Form for external Links""" + pt=zptFile(self, 'zpt/AddECHO_linkForm.zpt') + return pt() + + +def manage_addECHO_link(self,id,title,label,description="",contentType="",responsible="",link="",weight="",coords=[],credits=None,linkType="external",RESPONSE=None): + """Add an external Link""" + + newObj=ECHO_link(id,link,title,label,description,contentType,responsible,credits,weight,coords,linkType) self._setObject(id,newObj) - getattr(self,id)._setObject('scientific_Information',scientificInformationObj) - getattr(self,id).scientific_Information._setObject('scientific_Classification',scientificClassificationObj) + + getattr(self,id).addLinks='no' + if RESPONSE is not None: RESPONSE.redirect('manage_main') - -class ECHO_collection(Folder, Persistent, Implicit): + +class ECHO_collection(CatalogAware, Folder, Persistent, Implicit, Cacheable,ECHO_basis): """ECHO Collection""" + + management_page_charset="utf-8" security=ClassSecurityInfo() meta_type='ECHO_collection' + default_catalog='resourceCatalog' + +# viewClassificationList=viewClassificationListMaster + displayTypes=displayTypes + path="/mpiwg/online/permanent/shipbuilding" + def getSection(self, crumbs=None): + """returns the current section name""" + # use breadcrumbs if available + if crumbs is not None and len(crumbs) > 0: + return crumbs[0][2].getId() + + p = self + + sec = None + # descend parents to the root (and remember the last id) + while p is not None and p.meta_type != 'ECHO_root' and p.meta_type!='ECHO_main' and p.meta_type!='ECHO_nav': + sec = p.getId() + p = p.aq_parent + + return sec + + def getSubSection(self, crumbs=None): + """returns the current subsection name""" + # use breadcrumbs if available + if crumbs is not None and len(crumbs) > 1: + return crumbs[1][2].getId() + + p = self + sec = None + subsec = None + # descend parents to the root (and remember the last id) + while p is not None and p.meta_type != 'ECHO_root' and p.meta_type!='ECHO_main' and p.meta_type!='ECHO_nav': + subsec = sec + sec = p.getId() + p = p.aq_parent + + return subsec + + + def exportImportObjects_html(self,RESPONSE): + """ImportObject""" + pt=zptFile(self, 'zpt/exportImportObjects.zpt') + pt.content_type="text/html" + return pt() + + def importObjects_html(self,RESPONSE): + """ImportObject""" + pt=zptFile(self, 'zpt/importObjects.zpt') + pt.content_type="text/html" + return pt() + + def importObjects(self,zfile,RESPONSE=None,REQUEST=None): + """import object from file""" + + zf=zipfile.ZipFile(zfile,"r") + tmpdir=tempfile.mkdtemp() # create tempdir + ret=None + + for name in zf.namelist(): + ds,fn=tempfile.mkstemp() + tf=file(fn,"w") + x=zf.read(name) + tf.write(x) + tf.close() + try: + self._importObjectFromFile(fn,set_owner=1) + except: + if not ret: + ret="" + ret+="Cannot import: %s (Already existing?)
"%name + os.close(ds) + os.remove(fn) + + zf.close() + + if ret: + return """%s"""%ret + if RESPONSE: + RESPONSE.redirect(self.absolute_url()) + + def exportObjects_html(self,RESPONSE): + """Export objects""" + + pt=zptFile(self, 'zpt/exportObjects.zpt') + pt.content_type="text/html" + return pt() + + def exportObjects(self,ids,RESPONSE=None): + """export objects with type id""" + if not (type(ids) is ListType): + ids=[ids] + + tmpdir=tempfile.mkdtemp() # create tempdir + objs=self.ZopeFind(self,obj_ids=ids) + tmpfile=tempfile.mkstemp()[1] + + zf=zipfile.ZipFile(tmpfile,"w") + for obj in objs: + + f = os.path.join(tmpdir, '%s.zexp' %obj[0]) + #print E.absolute_url() + + obj[1]._p_jar.exportFile(obj[1]._p_oid, f) + + zf.write(f,obj[0]) + + zf.close() + shutil.rmtree(tmpdir) + if RESPONSE: + RESPONSE.setHeader("Content-Type","application/octet-stream") + len=os.stat(tmpfile)[6] + RESPONSE.setHeader("Content-Length",len) + RESPONSE.setHeader("Content-Disposition","""attachement; filename=%s"""%"export.zip") + fh=file(tmpfile) + for x in fh.read(): + RESPONSE.write(x) + fh.close() + + def getMDValueSimpleSearchField(self): + """returns value for simple search""" + return " ".join([self.title,self.description]) + + def getTitleAndLabel(self): + """gibt title und label zurueck""" + return (getattr(self,'title',''),getattr(self,'label','')) + + def localizeObjects(self): + """localize all objects""" + contents=self.ZopeFind(self,obj_metatypes=['ECHO_externalLink','ECHO_link','ECHO_mapText']) + + find=self.ZopeFind(self,obj_ids=('locale_en')) + if not find: + self.manage_addECHO_locale("en",'','') + for content in contents: + + if content[1].meta_type in ['ECHO_link','ECHO_externalLink']: + + find=content[1].ZopeFind(content[1],obj_metatypes=('ECHO_mapText')) + if find: + root=find[0][1] + + locale=find[0][1].ZopeFind(find[0][1],obj_ids=('locale_en')) + else: + root=None + else: + root=content[1] + locale=content[1].ZopeFind(content[1],obj_ids=('locale_en')) + if root and not locale: + root.manage_addECHO_locale("en",'','') + + pt=zptFile(self, 'zpt/localizeObjects.zpt') + return pt() + + + def localize(self,REQUEST,RESPONSE): + """localize""" + for key in REQUEST.form.keys(): + splitted=key.split("!") + + if splitted[0]=="" or splitted[0]=="en" or splitted[0]=="title" or splitted[0]=="label": + if splitted[0]=="en": + setattr(self.locale_en,splitted[1],REQUEST.form[key]) + else: + setattr(self,splitted[0],REQUEST.form[key]) + else: + obj=getattr(self,splitted[0]) + + if obj.meta_type=="ECHO_mapText": + if splitted[1]=="en": + obj.locale_en.pt_edit(REQUEST.form[key],obj.locale_en.content_type) + else: + obj.pt_edit(REQUEST.form[key],obj.content_type) + else: + text=obj.ZopeFind(obj,obj_metatypes=['ECHO_mapText']) + if splitted[1]=="en": + + text[0][1].locale_en.pt_edit(REQUEST.form[key],text[0][1].locale_en.content_type) + else: + text[0][1].pt_edit(REQUEST.form[key],text[0][1].content_type) + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + def getRDF(self,urn=None): + """rdf of the collection""" + + contents=self.ZopeFind(self,obj_metatypes=['ECHO_group','ECHO_resource','ECHO_collection']) + + ret=getRDFDescription(self,self.absolute_url(),urn=urn) + + if not urn: + urn=self.absolute_url() + + li="""\n""" + + + for content in contents: + try: + ret+=content[1].getRDF()+"\n" + except: + logging.error("getrdf: "+repr(content[1].getRDF())) + try: + ret+=self.unicodify(content[1].getRDF())+"\n" + except: + logging.error("--still cannot do it") + ret+=repr(content[1].getRDF())+"\n" + ret+="""\n"""%urn + for content in contents: + nurn=content[1].absolute_url() + ret+=li%nurn + return ret+"" + + + + def changeLabels(self): + """change form""" + pt=zptFile(self, 'zpt/changeLabelsForm') + pt.content_type="text/html" + return pt() + + def changeTitles(self): + """change form""" + pt=zptFile(self, 'zpt/changeTitleForm') + pt.content_type="text/html" + return pt() + + def changeWeights(self): + """change form""" + pt=zptFile(self, 'zpt/changeWeightForm') + pt.content_type="text/html" + return pt() + + def changeMetaDataLinks(self): + """change form""" + pt=zptFile(self, 'zpt/changeMetaDataLinkForm') + pt.content_type="text/html" + return pt() + + def changeAccessRightsCollectionForm(self,preselect=None): + """change access rights of all resources in this collection""" + + pt=zptFile(self, 'zpt/changeAccessRightsCollectionForm') + pt.content_type="text/html" + return pt(preselect=preselect) + + + def changeAccessRightsCollection(self): + """change""" + ret="" + argv=self.REQUEST.form + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) + for resource in resources: + + if argv.has_key(resource[1].getId()+'_xml'): + ret+=resource[1].getId()+" "+argv[resource[1].getId()+'_xml']+"
" + resource[1].setAccessRightXML(argv[resource[1].getId()+'_xml']) + resource[1].accessRight=argv[resource[1].getId()+'_xml'] + elif argv.has_key(resource[1].getId()+'_echo'): + ret+="only local:"+resource[1].getId()+" "+argv[resource[1].getId()+'_echo']+"
" + resource[1].accessRight=argv[resource[1].getId()+'_echo'] + else: + ret+="ERROR:" +resource[0] + return ret + + def changeMetaDataLinkInCollection(self): + """change all lables of a collection""" + ret="" + argv=self.REQUEST.form + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) + for resource in resources: + + try: + ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"
" + resource[1].metalink=argv[resource[1].getId()][0:] + except: + pass + return ret + + def changeMetaDataLinkInCollection(self): + """change all lables of a collection""" + ret="" + argv=self.REQUEST.form + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) + for resource in resources: + + try: + ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"
" + resource[1].metalink=argv[resource[1].getId()][0:] + except: + pass + return ret + + def changeWeightsInCollection(self): + """change all lables of a collection""" + ret="" + argv=self.REQUEST.form + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) + for resource in resources: + + try: + ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"
" + resource[1].weight=argv[resource[1].getId()][0:] + except: + pass + return ret + + def changeTitlesInCollection(self): + """change all lables of a collection""" + ret="" + argv=self.REQUEST.form + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) + for resource in resources: + + try: + ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"
" + resource[1].title=argv[resource[1].getId()][0:] + except: + pass + return ret + + def changeLabelsInCollection(self): + """change all lables of a collection""" + ret="" + argv=self.REQUEST.form + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_pageTemplate','ECHO_movie','ECHO_resource','ECHO_collection','ECHO_link','ECHO_externalLink']) + for resource in resources: + + try: + ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"
" + resource[1].label=argv[resource[1].getId()][0:] + except: + pass + return ret + + def importCollection(self,path=None,viewerUrl=None,metaDataUrl=None,replacePathPermanent=None,replacePathExperimental=None,RESPONSE=None): + """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner""" + + if path is None: + pt=zptFile(self, 'zpt/importCollection.zpt') + return pt() + + files=os.listdir(path) + ret="" + for fileName in files: + + if fileName: + + if (replacePathExperimental and replacePathExperimental!=''): + path=re.sub(replacePathExperimental,"/mpiwg/online/experimental",path) + + if (replacePathPermanent and replacePathPermanent!=''): + path=re.sub(replacePathPermanent,"/mpiwg/online/permanent",path) + + link=viewerUrl%(path+"/"+fileName+"/pageimg") + + metalink=metaDataUrl+"/"+path+"/"+fileName+"/index.meta" + try: + + #link="http://nausikaa2.mpiwg-berlin.mpg.de/cgi-bin/toc/toc.x.cgi?dir="+fileName+"&step=thumb" + + newObj=ECHO_resource(fileName,link,metalink,fileName,fileName,fileName,'','book','','','','','','') + self._setObject(fileName,newObj) + + genObj=getattr(self,fileName) + #genObj.createIndexFile() + ret+="OK:"+fileName+"
" + except: + print "ERROR" + ret+="ERROR:"+fileName+"
" + + return ret + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + def changeViewerTemplateSetsForm(self): + """change the viewer template set""" + pt=zptFile(self, 'zpt/changeViewerTemplateSet') + return pt() + + def getViewerTemplateSets(self,obj_ids=None,RESPONSE=None): + """Get the ViewerTemplateSet title for configuration""" + ret=[] + + try: + viewerTemplateSets=self.ZopeFind(self.viewerTemplateSets,obj_metatypes=['OSAS_viewerTemplateSet'],obj_ids=obj_ids)#assumes viewerTemplateSets folder somewhere in the hierarchie. + + for viewerTemplateSet in viewerTemplateSets: + ret.append((viewerTemplateSet[1].title,viewerTemplateSet[0],viewerTemplateSet[1])) + + return ret + + except: + return [('no ViewerTemplateSetfolders','')] + + def getTextToolsField(self,name,default=''): + """Lese viewerTemplateSet der Collection not implemented yet!""" + + return default + + + def isSelectedViewerTemplateSet(self,obj,id): + """is ausgewaehlt""" + + if self.REQUEST['viewerTemplateSet']==id: + return 1 + else: + return None + + def changeViewer(self,newViewer,REQUEST=None,RESPONSE=None): + """changes all ressources to the newViewer""" + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) + if RESPONSE is not None: + RESPONSE.write("") + + for resource in resources: + + done,msg=resource[1].changeViewer(newViewer) + if done: + if RESPONSE is not None: + RESPONSE.write("

OK: %s"%resource[0]) + else: + if RESPONSE is not None: + RESPONSE.write("

ERROR: %s (%s)"%(resource[1].absolute_url()+'/ECHO_resource_config_main',resource[0],msg)) + + + + if RESPONSE is not None: + RESPONSE.write("

Done

") + + def changeViewerTemplateSets(self,project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix,RESPONSE=None): + """change the templates""" + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) + + for resource in resources: + + resource[1].changeViewerTemplateSet(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix) + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + def setStartpageFolderForm(self): + """Form for changing the startpage""" + + + pt=zptFile(self, 'zpt/ChangeECHO_resourceStartPageFolder.zpt') + pt.content_type="text/html" + return pt() + + def setStartpageFolder(self,startpage=None,RESPONSE=None): + """change the templates""" + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) + + for resource in resources: + + resource[1].setStartPage(startpage) + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + def copyTitleToInfoXMLFolder(self,RESPONSE=None): + """copy title into the title field of info.xml + author and date werden leer!!! + """ + + + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) + + + for resource in resources: + ret,txt=resource[1].copyTitleToInfoXML() + if (not ret) and RESPONSE: + RESPONSE.write("error: %s\n"%txt) + if ret and RESPONSE: + RESPONSE.write("ok: %s\n"%txt) + + #logger("ECHO (copyTitleToInfoXMLFolder)",logging.INFO,txt) + if RESPONSE is not None: + RESPONSE.write("done!\n") + RESPONSE.close() + RESPONSE.redirect('manage_main') + + def copySearchFields(self,RESPONSE=None): + """copys < metadatafields to the object""" + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) + + for resource in resources: + + resource[1].copySearchFields() + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + def reloadMetaDataFromStorageWarning(self,RESPONSE=None): + """warning""" + pt=zptFile(self, 'zpt/reloadMetaDataFromStorageWarning.zpt') + pt.content_type="text/html" + return pt() + + def reloadMetaDataFromStorage(self,RESPONSE=None): + """copy metadata from the storage to ECHO""" + + return reloadMetaDataFromStorage(self,RESPONSE) + + + def getPartnerCopyright(self,name,sonst="generic"): + """gibt generisches copyright eines partners aus, sonst behalte jetzige einsteillung""" + #print "hi",name,sonst + #print getattr(self.partners,name).copyrightType + try: + partner=getattr(self.partners,name) + return partner.copyrightType + except: + print "error" + return sonst + + def partnerSelector_HTML(self,selected=None): + """give type selector""" + if not selected: + retStr="