--- ECHO_content/ECHO_collection.py 2005/10/28 13:25:01 1.244 +++ ECHO_content/ECHO_collection.py 2007/01/09 16:58:08 1.279 @@ -15,11 +15,12 @@ try: except: print "PDF generation will not work" - +import urlparse import string import tempfile +import zipfile import re -import os +import os,shutil import OFS.Image from types import * from OFS.Cache import Cacheable @@ -34,10 +35,11 @@ from Globals import DTMLFile import Globals from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PageTemplates.PageTemplate import PageTemplate -from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate +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 import urllib import cgi @@ -50,6 +52,7 @@ from Ft.Xml import EMPTY_NAMESPACE import Ft.Xml.XPath import cStringIO import zLOG +import sys try: from psycopg import libpq @@ -65,11 +68,26 @@ import urllib import xml.dom.minidom import ECHO_helpers from ECHO_helpers import * -from ECHO_language import * + +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 + + - + +def normalizeCt(str): + """normalizes content_type""" + #str= str.replace(" ","_") + return str.replace("-"," ").lower() def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""): @@ -83,6 +101,90 @@ def setECHO_collectionInformation(self,t self.credits=toList(credits) self.weight=weight +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 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() + + +manage_addECHO_partnerForm=DTMLFile('dtml/ECHO_partnerAdd',globals(), + Kind='ECHO_partner',kind='ECHO_partner') + + + +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. + + Creates a new ECHO_partner object 'id' with the contents of 'file'. + Based on Image.manage_addImage + """ + + id=str(id) + title=str(title) + content_type=str(content_type) + precondition=str(precondition) + + id, title = OFS.Image.cookId(id, title, file) + + self=self.this() + + # 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 + + 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""" @@ -257,7 +359,10 @@ class ECHO_fullText(ZopePageTemplate,ECH def getPage(self,nr='1'): """get page n""" #return self().encode('latin-1','ignore') - dom=xml.dom.minidom.parseString(self().encode('utf-8','ignore')) + try: + dom=xml.dom.minidom.parseString(self()) + except: + dom=xml.dom.minidom.parseString(self().encode('latin-1')) pages=dom.getElementsByTagName('page') return pages[int(nr)-1].toxml() @@ -314,7 +419,7 @@ class ECHO_resource(CatalogAware,Folder, def reindex(self): """generate fields for indexing and reindex""" - import urlparse + #TODO: korrigieren des metalink pfades konfigurierbar machen splitted= [x for x in urlparse.urlparse(self.metalink)] splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:] @@ -427,73 +532,134 @@ class ECHO_resource(CatalogAware,Folder, return ret+self.createSubElementRDF(urn=urn) - def getAccessRightSelectorHTML(self,outlook="select"): - """htmlselector""" - values=['free','mpiwg'] + def changeAccessRightForm(self,preselect=None): + """change the access rights""" + + pt=zptFile(self, 'zpt/ChangeECHO_resourceAccessRight.zpt') + return pt(preselect=preselect) + + def changeAccessRight(self): + """changeRights""" + argv=self.REQUEST.form + self.setAccessRightXML(argv["%s_xml"%self.getId()]) + self.accessRight=argv["%s_echo"%self.getId()] + + self.REQUEST.RESPONSE.redirect('manage_main') + + + def getAccessRightSelectorHTML(self,outlook="select",xmldominant=None,preselect=None): + """htmlselector, xmldominant= in der regel wird der wert des xmlfiles ausgegeben ausser er existiert nicht""" + values=['','free','MPIWG'] + if preselect:#set all to the preselected + ar=(preselect,preselect) + else:#else set to actual value + ar=self.getAccessRightMD() + if outlook=="select": - ret=""""""%self.getId() + ret1="""" + + if value==ar[1]: + ret1+=""%value + else: + ret1+=""%value + + + if not xmldominant: + return ret+"",ret1+"" + else: + if ar[0] is not None: + return ret+"" + else: + return "

No xml file (only local selection):"+ret1 else: ret="" + ret1="" for value in values: - if value==self.getAccessRightMD(): - ret+="""%s"""%(self.getId(),value,value) + if value==ar[0]: + ret+="""%s"""%(self.getId(),value,value) else: - ret+="""%s"""%(self.getId(),value,value) - return ret + ret+="""%s"""%(self.getId(),value,value) + + if value==ar[1]: + ret1+="""%s"""%(self.getId(),value,value) + else: + ret1+="""%s"""%(self.getId(),value,value) + + if not xmldominant: + return ret,ret1 + else: + if ar[0]: + return ret + else: + return "

No xml file (only local selection)

"+ret1 + + def copyAccessRightsFromMD(self): + """kopiere rechte aus den metadaten""" + self.accessRight=self.getAccessRightMD()[0] + + + + def getAccessRightMD(self): """set accessright""" url=self.metalink try: - geturl="" - for line in ECHO_helpers.urlopen(url).readlines(): - geturl=geturl+line - - + urllib.urlopen(url) except: - return (None,"Cannot open: "+url) + zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2]) + return None,getattr(self,'accessRight','') + + try: - dom=xml.dom.minidom.parseString(geturl) - root=dom.getElementsByTagName('resource')[0] + dom = NonvalidatingReader.parseUri(url) except: - return (None,"Cannot parse: "+url+"
"+geturl) + zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2]) + return (None,"Cannot parse: "+url+"
"+"%s (%s)"%sys.exc_info()[0:2]) - internal=dom.getElementsByTagName('internal') - if internal: - institution=dom.getElementsByTagName('institution') - return getText(institution[0].childNodes) - - free=dom.getElementsByTagName('free') - if free: - return "free" - return "free" #default free + accessright=dom.xpath("//meta/access-conditions/access/@type") + if accessright: + accessright=accessright[0].value + if str(accessright)=='institution': + tmp=dom.xpath("//meta/access-conditions/access/name") + if tmp: + accessright=getTextFromNode(tmp[0]) + + if not accessright: + accessright="" + + return accessright,getattr(self,'accessRight','') def changeAccessRightMD(self,accessright,RESPONSE=None): - """change the rights""" - + """change the rights - not user anymore""" + #TODO: check if method still needed params="accessright=%s"%accessright #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read() + tries=0 + for i in range(10): + 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() + if x=="ok": + + break; + - ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/setAccessRightXML'+urllib.quote('?'+params))).read() - if RESPONSE is not None: RESPONSE.redirect('manage_main') @@ -502,7 +668,13 @@ class ECHO_resource(CatalogAware,Folder, def setAccessRightXML(self,accessright): """set accessright""" url=self.metalink - + accessrights=['MPIWG','free']#allowes rights + + if accessright =='': + """do nothing""" + return "" + + try: geturl="" for line in ECHO_helpers.urlopen(url).readlines(): @@ -518,48 +690,59 @@ class ECHO_resource(CatalogAware,Folder, except: return (None,"Cannot parse: "+url+"
"+geturl) - metanodes=dom.getElementsByTagName('access-conditions') + metamains=dom.getElementsByTagName('meta') + + if not metamains: + nodenew=dom.createElement('meta') + root.appendChild(nodenew) + metamain=nodenew + else: + metamain=metamains[0] + + + metanodes=metamain.getElementsByTagName('access-conditions') if not metanodes: nodenew=dom.createElement('access-conditions') - root.appendChild(nodenew) + metamain.appendChild(nodenew) metanode=nodenew else: metanode=metanodes[0] accesses=metanode.getElementsByTagName('access') - if not accesses: - nodenew2=dom.createElement('access') - metanode.appendChild(nodenew2) - metanode2=nodenew2 - else: - metanode2=accesses[0] - - internal=metanode.getElementsByTagName('internal') - - if internal: - metanode2.removeChild(internal[0]).unlink() + #delete old + if accesses: + metanode.removeChild(accesses[0]).unlink() - free=metanode.getElementsByTagName('free') + #create new + + nodenew2=dom.createElement('access') + metanode.appendChild(nodenew2) + metanode2=nodenew2 - if free: - metanode2.removeChild(internal[0]).unlink() - - - if accessright=='free': - nodenew3=dom.createElement('free') - metanode2.appendChild(nodenew3) - elif accessright=='mpiwg': - nodenew3=dom.createElement('internal') - nodenew4=dom.createElement('institution') - metanodetext=dom.createTextNode('mpiwg') + attribute=metanode2.getAttribute('type') + + if accessright=="free": + + metanode2.setAttribute('type','free') + + elif accessright.upper()=='MPIWG': + metanode2.setAttribute('type','institution') + nodenew4=dom.createElement('name') + metanodetext=dom.createTextNode('MPIWG') nodenew4.appendChild(metanodetext) - nodenew3.appendChild(nodenew4) - metanode2.appendChild(nodenew3) - - return dom.toxml().encode('utf-8') + nodenew2.appendChild(nodenew4) + #print dom.toxml().encode('utf-8') + string= encodeRPC(dom.toxml().encode('utf-8')) + + #TODO: make server configurable + server=xmlrpclib.Server("http://foxridge.mpiwg-berlin.mpg.de/server") + path=urlparse.urlparse(self.metalink)[2] + + server.writeMetaDataFile(path,string,"yes") + def setStartPageForm(self): """Form for changing the startpage""" @@ -634,9 +817,14 @@ class ECHO_resource(CatalogAware,Folder, params="startpage=%s"%startpage #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)) - - 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() - + + tries=0 + for i in range(10): + 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() + if x=="ok": + + break; + path=self.metalink @@ -665,6 +853,11 @@ class ECHO_resource(CatalogAware,Folder, return pt() + def setLink(self, link=None): + """change link field""" + if link is not None: + self.link = link + def getTextToolsField(self,name,default=''): """Lese Textoolsfelder aus index.meta im path aus""" @@ -694,9 +887,17 @@ class ECHO_resource(CatalogAware,Folder, params="project=%s&xslt=%s&thumbtemplate=%s&topbar=%s&digiLibTemplate=%s&digiliburlprefix=%s"%(project,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix) - - 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() - + try: + tries=0 + for i in range(10): + 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() + if x=="ok": + + break; + + except: + zLOG.LOG("ECHO_ressource (changeViewerTemplateSet)", zLOG.ERROR,"%s (%s)"%sys.exc_info()[0:2]) + zLOG.LOG("ECHO_ressource (changeViewerTemplateSet)", zLOG.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))) #print self.absolute_url()+'/newMetaXML'+urllib.quote'?'+params) # hack Pfad auf die Dokumente path=self.metalink @@ -705,22 +906,15 @@ class ECHO_resource(CatalogAware,Folder, path=re.sub('/index.meta','',path) - path=re.sub(self.REQUEST['SERVER_URL'],'',path) - path=re.sub('http://'+self.REQUEST['HTTP_HOST'],'',path) - - path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server - path=re.sub('http://foxridge.mpiwg-berlin.mpg.de:8080','',path) # falls foxridge als server - path=re.sub('http://foxridge.mpiwg-berlin.mpg.de','',path) # falls foxridge als server - - path=re.sub('http://foxridge.rz-berlin.mpg.de:8080','',path) # falls foxridge als server - path=re.sub('http://foxridge.rz-berlin.mpg.de','',path) # falls foxridge als server - path=re.sub('http://content.mpiwg-berlin.mpg.de','',path) # falls content als server - path=re.sub('http://echo.mpiwg-berlin.mpg.de','',path) # falls echo - - path=re.sub('http://vision.rz-berlin.mpg.de','',path) # falls vision als server - - return ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines() + #TODO: direct access to the file system necessary, fix that also xmlrpc to the server where the index file is stored is possible + parsedUrl=urlparse.urlparse(path) + path=parsedUrl[2] + try: + return ECHO_helpers.urlopen("http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path).readlines() + except: + zLOG.LOG("ECHO_Resource (changeViewerTemplateSet)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2]) + zLOG.LOG("ECHO_Resource (changeViewerTemplateSet)", zLOG.INFO,"http://nausikaa2.rz-berlin.mpg.de:86/cgi-bin/toc/admin/reg.cgi?path=%s"%path) if RESPONSE is not None: RESPONSE.redirect('manage_main') @@ -856,6 +1050,25 @@ class ECHO_resource(CatalogAware,Folder, 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 getCredits(self): """Ausgabe der credits""" @@ -896,7 +1109,7 @@ class ECHO_resource(CatalogAware,Folder, def getContentType(self): try: - return self.contentType + return normalizeCt(self.contentType) except: return "" @@ -1011,7 +1224,7 @@ class ECHO_resource(CatalogAware,Folder, def changeECHO_resource_metadata_local(self,RESPONSE=None): """change metadata""" - tags=self.findTagsFromMapping(self.contentType) + tags=self.findTagsFromMapping(normalizeCt(self.contentType)) for field in tags[1]: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)][0:] @@ -1022,29 +1235,97 @@ class ECHO_resource(CatalogAware,Folder, def changeECHO_resource_metadata(self,RESPONSE=None): """change metadata""" - tags=self.findTagsFromMapping(self.contentType) + tags=self.findTagsFromMapping(normalizeCt(self.contentType)) self.OSAS_meta={} for field in tags[1]: try: self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)] self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)] except: - """nothing""" - - 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() + zLOG.LOG("ECHO_collection (changeECHO_resource_metadata)",zLOG.ERROR,"%s (%s)"%sys.exc_info()[0:2]) + print self.newMetaXML() + tries=0 + for i in range(10): + 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() + if x=="ok": + + break; + + if RESPONSE is not None: RESPONSE.redirect('manage_main') + - def getMDValue(self,fieldName,empty=None): - if not empty: - return self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%self.contentType) + def getMDValueSimpleSearchField(self): + """returns value for simple search""" + try: + return " ".join([self.getMDValue('title',generic="yes"), + self.getMDValue('author',generic="yes"), + self.getMDValue('year',generic="yes"),self.getTitle()]) + except: + + #zLOG.LOG(" ECHO_collection(getMDSimpleSearchField)",zLOG.INFO," ".join([self.getMDValue('title',generic="yes"), + # self.getMDValue('author',generic="yes"), + # self.getMDValue('year',generic="yes"),''])) + return "" + + def getMDValue(self,fieldNameTest,empty=None,generic=None): + """get md values""" + #TODO: cache mappinghash + + fieldName=None + if generic: + if self.contentType: + ct=self.contentType.replace(" ","_").lower() + ct=self.contentType.replace("-","_").lower() + else: + zLOG.LOG("ECHO_collection (getMDValue)", zLOG.INFO, "no_content type for %s"%self.getId()) + ct="" + + #caching + if not hasattr(self,'_v_mapHash'): #noch keine cachevariable + self._v_mapHash={} + + + + tmp=self._v_mapHash.get(ct,None) + if tmp: #teste ob type schon existiert + fieldName=tmp.get(fieldNameTest,None) + else: + self._v_mapHash[ct]={} + + + #noch nicht gecached + if not fieldName and hasattr(self.standardMD,ct): + fieldName=getattr(self.standardMD,ct).generateMappingHash()[fieldNameTest][0] + self._v_mapHash[ct][fieldNameTest]=fieldName + if not fieldName: + fieldName=fieldNameTest + if not empty: + #FIXME: warum gibt es manchmal kein metadatahas + try: + + ret =self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%normalizeCt(self.contentType)) + except: + zLOG.LOG("ECHO (line 1069)",zLOG.ERROR,"no md hash for %s"%self.getId()) + return "" + else: - return self.metaDataHash.get(fieldName,empty) - + + + ret= self.metaDataHash.get(fieldNameTest,empty) + + if type(ret) is StringType: + return ret.decode('utf-8') + else: + return ret + + getFieldValue=getMDValue #depricated + def newMetaXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None,digiliburlprefix=None): """new index.meta""" self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') @@ -1053,8 +1334,12 @@ class ECHO_resource(CatalogAware,Folder, self.copyIndex_meta2echo_resource() try: + + return writeMetadata(self.metalink,self.OSAS_meta,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix) except: + #print self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix + return writeMetadata(self.metalink,self.metaDataHash,project,startpage,xslt,thumbtemplate,topbar,digiLibTemplate,digiliburlprefix=digiliburlprefix) def showMetaDataXML(self,project=None,startpage=None,xslt=None,thumbtemplate=None,topbar=None,digiLibTemplate=None): @@ -1117,6 +1402,7 @@ class ECHO_resource(CatalogAware,Folder, {'label':'Change TemplateSets and Image Viewer','action':'changeViewerTemplateSetForm'}, {'label':'set/change startpage','action':'setStartPageForm'}, {'label':'Copy MD for indexing and search','action':'copySearchFields'}, + {'label':'Change AccessRights','action':'changeAccessRightForm'}, ) @@ -1153,20 +1439,6 @@ class ECHO_resource(CatalogAware,Folder, return field - - def getFieldValue(self,field): - """get value""" - - try: - - ret=self.metaDataHash[field] - if ret == "": - return None - else: - - return ret - except: - return None def getMetaDataHash(self): """md hash""" @@ -1174,17 +1446,18 @@ class ECHO_resource(CatalogAware,Folder, def setFieldValue(self,field,value): """get value""" + #TODO: remove setFieldValue if not hasattr(self,'metaDataHash'): setattr(self,'metaDataHash',{}) self.metaDataHash[field]=value[0:] - def copySearchFields(self): """copys metadatafields to the object""" fields=['author','title','year'] + for field in fields: - setattr(self,'MD_'+field,self.getFieldValue(field)) + setattr(self,'MD_'+field,self.getMDValue(field,generic="yes")) def findLabelsFromMapping(self,referenceType): @@ -1202,11 +1475,12 @@ class ECHO_resource(CatalogAware,Folder, fields=[] fieldlist=self.standardMD.fieldList - tags=self.findTagsFromMapping(self.contentType) + tags=self.findTagsFromMapping(normalizeCt(self.contentType)) self.referencetypes=tags[2] for referenceTypeF in self.referencetypes: - - if referenceTypeF[1].title.lower() == referenceType.lower(): + + + if normalizeCt(referenceTypeF[1].title) == normalizeCt(referenceType.lower()): try: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields @@ -1235,9 +1509,7 @@ class ECHO_resource(CatalogAware,Folder, #self.referencetypes=temp[0:] - - - + bibdata={} retdata={} @@ -1246,7 +1518,7 @@ class ECHO_resource(CatalogAware,Folder, for referenceTypeF in temp: #print referenceType - if referenceTypeF[1].title.lower() == referenceType.lower(): + if normalizeCt(referenceTypeF[1].title) == normalizeCt(referenceType.lower()): try: bibdata[referenceTypeF[1].title]=referenceTypeF[1].fields referenceType=referenceTypeF[1].title @@ -1273,10 +1545,10 @@ class ECHO_resource(CatalogAware,Folder, return "ERROR:",error,self.absolute_url() - self.contentType=metadict['bib_type'][0:] - fields=self.findTagsFromMapping(self.contentType) + self.contentType=normalizeCt(metadict['bib_type'])[0:] + fields=self.findTagsFromMapping(normalizeCt(self.contentType)) - #fields=self.findLabelsFromMapping(self.contentType) + #fields=self.findLabelsFromMapping(normalizeCt(self.contentType)) for field in fields[1]: if self.isDefinedInThisSet(fields,field): @@ -1288,36 +1560,40 @@ class ECHO_resource(CatalogAware,Folder, if RESPONSE: return RESPONSE.redirect('manage_main') - def ECHO_getResourceMD(self,template="yes",back=None): + return "OK:",self.absolute_url(),normalizeCt(self.contentType) + + def ECHO_getResourceMD(self,template="yes",back=None,overwrite="no"): """Einlesen der Metadaten und Anlegen dieser Metadaten als Informationen zur Resource""" (metadict, error)=readMetadata(self.metalink) - + if back: self.REQUEST.SESSION['back']=back if not error=="": #Fehler beim Auslesen des Metafiles return "ERROR:",error - if not self.contentType: - self.contentType=metadict['bib_type'].lower() + if (not self.contentType) or (overwrite=="yes"): + self.contentType=normalizeCt(normalizeCt(metadict['bib_type']).lower()) - if not (metadict['bib_type'].lower()==self.contentType.lower()): - self.REQUEST.SESSION['contentStorage']=metadict['bib_type'] - self.REQUEST.SESSION['contentZope']=self.contentType + if not (normalizeCt(metadict['bib_type']).lower()==normalizeCt(self.contentType).lower()): + self.REQUEST.SESSION['contentStorage']=normalizeCt(metadict['bib_type']) + self.REQUEST.SESSION['contentZope']=normalizeCt(self.contentType) return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')() - self.REQUEST.SESSION['metadict']=metadict - + #self.REQUEST.SESSION['metadict']=metadict - self.REQUEST.SESSION['diffs']=checkDiffs(self,self.REQUEST.SESSION['metadict']) - + self.REQUEST.SESSION['diffs']=checkDiffs(self,metadict) + + if template=="yes": + #pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_resourceMD.zpt'),metadict=metadict).__of__(self) pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt') - return pt() + + return pt(metadict=metadict) @@ -1382,7 +1658,7 @@ class ECHO_resource(CatalogAware,Folder, def generate_label(self): """Erzeugt_standard_Label aus Template""" - pt=getattr(self,"label_template_"+self.contentType.lower()) + pt=getattr(self,"label_template_"+normalizeCt(self.contentType).lower()) self.label=pt()[0:] return pt() @@ -1391,7 +1667,7 @@ class ECHO_resource(CatalogAware,Folder, def generate_title(self,RESPONSE=None): """Erzeugt_standard_Label aus Template""" - pt=getattr(self,"label_template_"+self.contentType.lower()) + pt=getattr(self,"label_template_"+normalizeCt(self.contentType).lower()) self.title=pt()[0:] @@ -1425,7 +1701,14 @@ class ECHO_externalLink(Folder,ECHO_basi security.declarePublic('content_html') def content_html(self): """template fuer content""" - return ECHO_basis.content_html(self,'externalLink') + 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): @@ -1498,8 +1781,9 @@ 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'}, + + manage_options = ECHO_externalLink.manage_options+( + {'label':'add links config','action':'ECHO_link_addLinksForm'}, ) def ECHO_link_addLinksForm(self): @@ -1516,16 +1800,93 @@ class ECHO_link(ECHO_externalLink): 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') - try: - return ret.decode('utf-8') - except: - return ret + + #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""" @@ -1570,16 +1931,100 @@ def manage_addECHO_link(self,id,title,la RESPONSE.redirect('manage_main') -class ECHO_collection(Folder, Persistent, Implicit, Cacheable,ECHO_basis): +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 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(): + fn=tempfile.mkstemp()[1] + 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.remove(fn) + + 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','')) @@ -1688,6 +2133,15 @@ class ECHO_collection(Folder, Persistent 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="" @@ -1696,11 +2150,15 @@ class ECHO_collection(Folder, Persistent resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) for resource in resources: - try: - ret+=resource[1].getId()+" "+argv[resource[1].getId()]+"
" - resource[1].changeAccessRightMD(argv[resource[1].getId()]) - except: - pass + 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): @@ -1778,15 +2236,20 @@ class ECHO_collection(Folder, Persistent pass return ret - def updateCollection(self,RESPONSE=None): + def importCollection(self,path=None,RESPONSE=None): """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner""" - files=os.listdir(self.path) + + if path is None: + pt=zptFile(self, 'zpt/importCollection.zpt') + return pt() + + files=os.listdir(path) ret="" for fileName in files: if fileName: - tempPath=re.sub("/mpiwg/online","",self.path) + tempPath=re.sub("/mpiwg/online","",path) link="http://echo.mpiwg-berlin.mpg.de/zogilib_book?fn="+tempPath+"/"+fileName+"/pageimg" metalink=self.path+"/"+fileName+"/index.meta" @@ -1809,20 +2272,6 @@ class ECHO_collection(Folder, Persistent if RESPONSE is not None: RESPONSE.redirect('manage_main') - def updateCollectionMD(self,RESPONSE=None): - """updateMD""" - files=os.listdir(self.path) - for fileName in files: - if fileName: - genObj=getattr(self,fileName) - genObj.copyIndex_meta2echo_resource() - genObj.generate_title() - - if RESPONSE is not None: - RESPONSE.redirect('manage_main') - - - def changeViewerTemplateSetsForm(self): """change the viewer template set""" pt=zptFile(self, 'zpt/changeViewerTemplateSet') @@ -1913,8 +2362,8 @@ class ECHO_collection(Folder, Persistent RESPONSE.redirect('manage_main') def copySearchFields(self,RESPONSE=None): - """copys import metadatafields to the object""" - resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource']) + """copys < metadatafields to the object""" + resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'],search_sub=1) for resource in resources: @@ -1932,7 +2381,7 @@ class ECHO_collection(Folder, Persistent def reloadMetaDataFromStorage(self,RESPONSE=None): """copy metadata from the storage to ECHO""" - return reloadMetaDataFromStorage(self,RESPONSE=None) + return reloadMetaDataFromStorage(self,RESPONSE) def getPartnerCopyright(self,name,sonst="generic"): @@ -1954,11 +2403,13 @@ class ECHO_collection(Folder, Persistent retStr="