--- ECHO_content/ECHO_collection.py 2005/10/10 19:11:12 1.236 +++ ECHO_content/ECHO_collection.py 2005/11/23 15:50:36 1.254 @@ -14,7 +14,7 @@ try: from reportlab.lib.pagesizes import A4 except: print "PDF generation will not work" - + import string import tempfile @@ -67,12 +67,7 @@ import ECHO_helpers from ECHO_helpers import * from ECHO_language import * from ECHO_movie import * - -#regexp for extracting elements from xml -patternTXT=r"<\s*txt.*?>(.*?)" -regexpTXT = re.compile(patternTXT, re.IGNORECASE + re.DOTALL) -patternPage=r"<\s*page.*?>(.*?)" -regexpPage = re.compile(patternPage, re.IGNORECASE + re.DOTALL) +import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen @@ -951,8 +946,7 @@ class ECHO_resource(CatalogAware,Folder, self.contentType=self.bib_type for data in self.metadata: data_neu=re.sub('-','_',data) - self.meta - DataHash[data_neu]=getattr(self,data)[0:] + self.metaDataHash[data_neu]=getattr(self,data)[0:] pt=zptFile(self, 'zpt/ChangeECHO_resource_metadata.zpt') @@ -1043,14 +1037,47 @@ class ECHO_resource(CatalogAware,Folder, if RESPONSE is not None: RESPONSE.redirect('manage_main') + + - def getMDValue(self,fieldName,empty=None): + def getMDValue(self,fieldNameTest,empty=None,generic=None): + """get md values""" + #TODO: cache mappinghash + + fieldName=None + if generic: + ct=self.contentType.replace(" ","_").lower() + + #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: return self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%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) - + + return self.metaDataHash.get(fieldNameTest,empty) + + 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') @@ -1159,20 +1186,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""" @@ -1180,6 +1193,7 @@ class ECHO_resource(CatalogAware,Folder, def setFieldValue(self,field,value): """get value""" + #TODO: remove setFieldValue if not hasattr(self,'metaDataHash'): setattr(self,'metaDataHash',{}) @@ -1189,8 +1203,9 @@ class ECHO_resource(CatalogAware,Folder, 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): @@ -1241,9 +1256,7 @@ class ECHO_resource(CatalogAware,Folder, #self.referencetypes=temp[0:] - - - + bibdata={} retdata={} @@ -1294,7 +1307,9 @@ 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(),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) @@ -1304,7 +1319,7 @@ class ECHO_resource(CatalogAware,Folder, if not error=="": #Fehler beim Auslesen des Metafiles return "ERROR:",error - if not self.contentType: + if (not self.contentType) or (overwrite=="yes"): self.contentType=metadict['bib_type'].lower() if not (metadict['bib_type'].lower()==self.contentType.lower()): @@ -1431,7 +1446,18 @@ 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') + + + try: + return ret.encode('utf-8') + + except: + try: + return ret.decode('latin-1') + except: + + return ret def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords): @@ -1505,14 +1531,48 @@ class ECHO_link(ECHO_externalLink): 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"): - return ECHO_basis.content_html(self,'link') + ret=ECHO_basis.content_html(self,'link') + else: - return ECHO_basis.content_html(self,'collection') + 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 index_html(self): """standard link""" if self.link: @@ -1528,8 +1588,9 @@ class ECHO_link(ECHO_externalLink): else: params={} - params['backLink']=self.aq_parent.absolute_url() - params['startLink']=splitted[0]+"?"+urllib.urlencode(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)) @@ -1548,7 +1609,9 @@ def manage_addECHO_link(self,id,title,la newObj=ECHO_link(id,link,title,label,description,contentType,responsible,credits,weight,coords) self._setObject(id,newObj) - + + getattr(self,id).addLinks='no' + if RESPONSE is not None: RESPONSE.redirect('manage_main') @@ -1563,6 +1626,10 @@ class ECHO_collection(Folder, Persistent path="/mpiwg/online/permanent/shipbuilding" + 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']) @@ -1757,15 +1824,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" @@ -1788,20 +1860,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') @@ -1892,8 +1950,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: @@ -1911,7 +1969,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"): @@ -2122,7 +2180,7 @@ class ECHO_collection(Folder, Persistent {'label':'Set Startpage','action':'setStartpageFolderForm'}, {'label':'Change Viewer Templates and Image Viewer','action':'changeViewerTemplateSetsForm'}, {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'}, - {'label':'ImportCollection','action':'updateCollection'}, + {'label':'ImportCollection','action':'importCollection'}, {'label':'Copy MD for indexing and search','action':'copySearchFields'}, ) @@ -2218,8 +2276,18 @@ class ECHO_collection(Folder, Persistent def content_html(self,**argv): """template fuer content""" #print "NN",argv - return ECHO_basis.content_html(self,'collection') - + ret = ECHO_basis.content_html(self,'collection') + + try: + return ret.encode('utf-8') + except: + + try: + return ret.decode('latin-1') + except: + + return ret + def getCredits(self): """Ausgabe der credits""" if self.credits: @@ -2575,15 +2643,28 @@ class ECHO_root(Folder,Persistent,Implic security=ClassSecurityInfo() meta_type="ECHO_root" + - def findObjectFromFulltext(self,url=None,existUri=None): + def mod_re_sub(self,pattern,replace,string): + """re.sub aus mod re zur Verfuegung stellen""" + return re.sub(pattern,replace,string) + + def findObjectFromFulltext(self,existUri): ''' @param url: @param existUri: ''' - #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids. - return None + + if existUri: + #TODO: at the moment assume that the filename is unique, the whole has to changed to a system of ids. + filename=existUri.split("/")[-1] + + founds=self.resourceCatalog.search({'fullTextUrl':os.path.splitext(filename)[0]}) + + ret=[(found.title,found.getObject().absolute_url(),found.getObject().aq_parent.absolute_url()) for found in founds] + + return ret def reindex(self,RESPONSE=None): """indiziere alle Objecte neu""" @@ -3141,100 +3222,29 @@ class ECHO_root(Folder,Persistent,Implic else: return "" - def link2html(self,str): - """link2html fuer VLP muss hier noch raus""" - if str: - - str=re.sub("\&","&",str) - dom=xml.dom.minidom.parseString(""+str+"") - links=dom.getElementsByTagName("link") - - - for link in links: - link.tagName="a" - ref=link.getAttribute("ref") - pn=link.getAttribute("page") - - if self.checkRef(ref): - if pn: - link.setAttribute("href",self.aq_parent.absolute_url()+"/references?id="+ref+"&page="+pn) - else: - link.setAttribute("href",self.aq_parent.absolute_url()+"/references?id="+ref) - - - newxml=dom.toxml('utf-8') - - retStr=regexpTXT.search(newxml) - - return retStr.group(1) - - - return "" - - def xml2html(self,str,quote="yes"): - """link2html fuer VLP muss hier noch raus""" - - if str: - if quote=="yes2": - str=re.sub("\&","&",str) - #dom=xml.dom.minidom.parseString(str) - dom = NonvalidatingReader.parseString(str,"http://www.mpiwg-berlin.mpg.de/") - #links=dom.getElementsByTagName("link") - links=Ft.Xml.XPath.Evaluate(".//link", contextNode=dom) - for link in links: - #link.tagName="a" - - ref=link.getAttributeNS(EMPTY_NAMESPACE,"ref") - pn=link.getAttributeNS(EMPTY_NAMESPACE,"page") - - cns=link.childNodes[0:] - - newLink=dom.createElementNS(EMPTY_NAMESPACE,"a") - for x in cns: - newLink.appendChild(x) - - - - link.parentNode.replaceChild(newLink,link) - if self.checkRef(ref): - if pn: - newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref+"&p="+pn) - else: - newLink.setAttributeNS(EMPTY_NAMESPACE,"href",self.aq_parent.absolute_url()+"/vlp_coll?id="+ref) - - #str= dom.toxml('utf-8') - buf = cStringIO.StringIO() - PrettyPrint(dom, stream=buf) - str = buf.getvalue() - buf.close() - #str=PrettyPrint(dom.documentElement,encoding='UTF-8') - #print link.toxml('utf-8') - #print type(str) - retStr=regexpPage.search(str) - - try: # hack warum fehtl manchmal page?? - return retStr.group(1) - except: - return str - return "" + link2html=vlp_xmlhelpers.link2html - def checkRef(self,ref): - if ref[0:3]=='lit': - if len(self.library_data({ 'id':ref}))>0: - return 1 - try: - if ref[0:7]=="tec_cat": - return 1 - except: - """nothing""" - - dbs={'vl_technology':'','vl_people':" AND complete='yes'",'vl_sites':''} - res=None - for db in dbs.keys(): - res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db]))) - return res - - #Ende Methode fuer vlp + xml2html=vlp_xmlhelpers.xml2html + + checkRef=vlp_xmlhelpers.checkRef + +# def checkRef(self,ref): +# if ref[0:3]=='lit': +# if len(self.library_data({ 'id':ref}))>0: +# return 1 +# try: +# if ref[0:7]=="tec_cat": +# return 1 +# except: +# """nothing""" +# +# dbs={'vl_technology':'','vl_people':" AND complete='yes'",'vl_sites':''} +# res=None +# for db in dbs.keys(): +# res=res or self.search(var=str("select reference from %s where reference =\'%s\' %s"%(db,ref,dbs[db]))) +# return res +# +# #Ende Methode fuer vlp def PgQuoteString(self,string): """Quote string""" @@ -3812,7 +3822,7 @@ def repairCoords(self): print "fixing: ", col.id msg += "fixing: "+col.id+"\n" coords = col.coords - if len(coords) > 0: + if len(coords) > 0: # delete old MapAreas for areas in self.ZopeFind(col, obj_metatypes=['MapArea']): #area = areas[1]