--- OSA_system2/OSAS_metadata.py 2005/03/03 20:41:00 1.4 +++ OSA_system2/OSAS_metadata.py 2010/10/11 13:15:37 1.19 @@ -6,12 +6,23 @@ from OFS.Folder import Folder from AccessControl import ClassSecurityInfo from Products.PageTemplates.PageTemplateFile import PageTemplateFile import os.path +import sys import xml.dom.minidom import xml.dom.pulldom import OSAS_helpers -import zLOG +import logging + +#ersetzt logging +def logger(txt,method,txt2): + """logging""" + logging.info(txt+ txt2) + + import string -import xml.xpath +try: + from xml.xpath import Evaluate +except: + from Ft.Xml.XPath import Evaluate import xmlrpclib from types import * @@ -37,7 +48,7 @@ class OSAS_MetadataMapping(SimpleItem): for fieldName in arglist.keys(): setattr(self,"md_"+fieldName,arglist[fieldName]) - + manage_options = SimpleItem.manage_options+( {'label':'Main Config','action':'changeMetadataMappingForm'}, ) @@ -83,7 +94,7 @@ class OSAS_MetadataMapping(SimpleItem): """erzeugen des dictionaries: generisches Feld -> Definition in diesem Schema""" hash={} for field in self.fieldList: - hash[field]=getattr(self,"md_"+field) + hash[field]=getattr(self,"md_"+field,'') return hash @@ -106,7 +117,7 @@ class OSAS_MetadataMapping(SimpleItem): if RESPONSE is not None: RESPONSE.redirect('manage_main') - + manage_workspace=changeMetadataMappingForm def manage_addMetadataMappingForm(self): """interface for adding the OSAS_root""" @@ -120,7 +131,7 @@ def manage_addMetadataMapping(self,idOfO argList={} for arg in self.fieldList: if not (arg in ['idOfObject','titleOfObject']): - argList[arg]=(self.REQUEST.form[arg],self.REQUEST.form['label_'+arg],self.REQUEST.form['explanation_'+arg],arglist['status_'+fieldName],arglist['values_'+fieldName]) + argList[arg]=(self.REQUEST.form[arg],self.REQUEST.form['label_'+arg],self.REQUEST.form['explanation_'+arg],self.REQUEST.form['status_'+arg],self.REQUEST.form['values_'+arg]) newObj=OSAS_MetadataMapping(idOfObject,titleOfObject,argList) self._setObject(idOfObject,newObj) @@ -130,7 +141,7 @@ def manage_addMetadataMapping(self,idOfO class OSAS_Metadata(Folder): - """Foldertype enthält methoden zur Halbautomatischen Erstellung von Metadatenfiles""" + """Foldertype enthaelt methoden zur Halbautomatischen Erstellung von Metadatenfiles""" security=ClassSecurityInfo() def __init__(self,id,shortDescription,description,fields): @@ -161,48 +172,65 @@ class OSAS_Metadata(Folder): else: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') return ret - - def showOverviewXML(self,RESPONSE): + + + def showOverviewXML(self,RESPONSE=None,wrapped=False): """gives an overview over the Metadata stored in this folder""" - ret=""""""%self.getId() + ret="" + if wrapped: + ret+="""""" + ret+=""""""%self.getId() ret+=self.showGenericXML() - for entry in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping']): + for entry in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping__neu']): ret+=entry[1].showSetXML() + for entry in self.ZopeFind(self,obj_metatypes=['OSAS_Metadata__neu']): + ret+=entry[1].showOverviewXML() + ret+="" + if wrapped: + ret+="""""" if not RESPONSE: return ret else: - self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml') + RESPONSE.setHeader('Content-Type','text/xml') return ret def generateMappingList(self): """Erzeuge Mapping""" mapping={} + for dict in self.__dict__: #print dict obj=getattr(self,dict) if hasattr(obj,'meta_type'): - if obj.meta_type=="OSAS_MetadataMapping": + logging.debug("generateMappungList read type:"+repr(obj.meta_type)) + if ((obj.meta_type=="OSAS_MetadataMapping__neu") or (obj.meta_type=="MetadataMapping")): #metadatamapping is the newer type + logging.debug("generateMappungListadded:"+repr(obj.getId())) mapping[obj.getId()]=obj.generateMappingHash() + return mapping def generateMappingForType(self,type,clean="yes"): """erzeuge spezifisches Mapping""" - hash=self.generateMappingList() - if hash.has_key(type): - if clean=="yes": - temp={} - for x in hash[type].keys(): - if not hash[type][x]=="": - temp[x]=hash[type][x] - return temp - else: - return hash[type] - else: - return {} + hash=self.generateMappingList() + logging.debug("generateMappingForType:"+type) + for key in hash.keys(): + logging.debug("generateMappingForType comparing:"+key.lower()+type.lower()) + if (key.lower() == type.lower()): + if clean=="yes": + temp={} + for x in hash[key].keys(): + if not hash[key][x]=="": + temp[x]=hash[key][x] + return temp + else: + + return hash[key] + + return {} def getFieldList(self): """erzeuge string aus fields""" @@ -211,6 +239,7 @@ class OSAS_Metadata(Folder): except: return "" + security.declarePublic('getFields') def getFields(self): """ausgabe der Felder""" return self.fieldList @@ -234,16 +263,16 @@ class OSAS_Metadata(Folder): def getStoredTypes(self): - """Gebe gespeicherte typen zurück""" + """Gebe gespeicherte typen zurueck""" types=[] - for obj in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping_neu']): - if obj.title=="": - title=obj.id - else: - title=obj.title - types.append((obj.id,title,obj)) + for obj in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping__neu']): + if obj[1].title=="": + title=obj[1].id + else: + title=obj[1].title + types.append((obj[1].id, title, obj[1])) return types @@ -262,38 +291,42 @@ class OSAS_Metadata(Folder): def getDisplayFieldsAsStr(self,indexMeta): ret=[] + try: + if indexMeta and not (indexMeta==""): + dom=xml.dom.pulldom.parseString(indexMeta) - dom=xml.dom.pulldom.parseString(indexMeta) - - for (event,node) in dom: - - if event == xml.dom.pulldom.START_ELEMENT and node.tagName=="bib": - dom.expandNode(node) + for (event,node) in dom: - try: - type=node.getAttribute('type') - mapping=getattr(self,type).generateMappingHash() - except: - type='generic' - mapping=getattr(self,type).generateMappingHash() + if event == xml.dom.pulldom.START_ELEMENT and node.tagName=="bib": + dom.expandNode(node) - for field in self.displayFields: try: - ret.append(OSAS_helpers.getText(node.getElementsByTagName(mapping[field][0])[0].childNodes)) + type=node.getAttribute('type') + mapping=getattr(self,type).generateMappingHash() except: - """nothing""" - - return "; ".join(ret) + type='generic' + mapping=getattr(self,type).generateMappingHash() + for field in self.displayFields: + try: + ret.append(OSAS_helpers.getText(node.getElementsByTagName(mapping[field][0])[0].childNodes)) + except: + """nothing""" + + return "; ".join(ret) + else: + return "" + except: + return "" def getDisplayFieldsAsStrOLD(self,indexMeta): - """Gebe display fields als string zurück + """Gebe display fields als string zurueck @param path: Pfad zum Object """ ret=[] try: dom=xml.dom.minidom.parseString(indexMeta) except: - zLOG.LOG("OSAS_metadata (getDisplayFieldsAsStr)",zLOG.INFO,"Cannot parse: %s"%indexMeta) + logger("OSAS_metadata (getDisplayFieldsAsStr)",logging.INFO,"Cannot parse: %s"%indexMeta) try: bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0] except: @@ -384,31 +417,87 @@ class OSAS_Metadata(Folder): pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetadataForm_template.zpt')).__of__(self) return pt() + def readMetadata(self,MDF_path,MDF_type,MDF_prefix="",MDF_xpathStart="", MDF_addPath=None,MDF_identifyFields=None,newdoc=None,actualNode=None): + + if type(MDF_path)==ListType: + MDF_path=MDF_path[0] + + indexFile=os.path.join(MDF_path,'index.meta') + + server=xmlrpclib.Server(self.serverUrl) + + documentStr=server.getFile(indexFile) + + if documentStr: + newdoc=xml.dom.minidom.parseString(documentStr) + dom=newdoc.documentElement + actualNode=dom + else: + return {} + + if self.containerTag=="": + containerTag="doc" + else: + containerTag=self.containerTag + + if MDF_xpathStart=="": + dom=newdoc.documentElement + actualNode=dom + else: + #try to find xpath + if MDF_identifyFields: + query=[] + for field in MDF_identifyFields.keys(): + + query.append("""(%s="%s")"""%(field,MDF_identifyFields[field])) + querystr=" and ".join(query) + xpathStr=MDF_xpathStart+"[%s]"%querystr + + else: + xpathStr=MDF_xpathStart + + + xpathNodes=Evaluate(xpathStr,actualNode) + + + if len(xpathNodes)>0: + actualNode=xpathNodes[0] + else: + return {} + + ret={} + for node in actualNode.childNodes: + name=node.tagName + text=OSAS_helpers.getText(node.childNodes) + ret[name]=text + + return ret + def writeMetadata(self,MDF_path,MDF_type,form,MDF_prefix="",MDF_xpathStart="", MDF_addPath=None,MDF_identifyFields=None,newdoc=None,actualNode=None): """writeMetadata""" #MDF_path="/tmp/index.meta" if type(MDF_path)==ListType: MDF_path=MDF_path[0] + indexFile=os.path.join(MDF_path,'index.meta') - print "load index file",indexFile + server=xmlrpclib.Server(self.serverUrl) if newdoc: if not actualNode: actualNode=newdoc dom=newdoc else: documentStr=server.getFile(indexFile) - print indexFile - print "ds",documentStr + if documentStr: - print "hhh" + newdoc=xml.dom.minidom.parseString(documentStr) dom=newdoc.documentElement actualNode=dom else: - print "ho2" + impl=xml.dom.minidom.getDOMImplementation() newdoc=None @@ -438,8 +527,8 @@ class OSAS_Metadata(Folder): else: xpathStr=MDF_xpathStart - print xpathStr,actualNode - xpathNodes=xml.xpath.Evaluate(xpathStr,actualNode) + + xpathNodes=Evaluate(xpathStr,actualNode) @@ -450,7 +539,7 @@ class OSAS_Metadata(Folder): else: #existiert nicht dann neue erzeugen - if len(xml.xpath.Evaluate(MDF_xpathStart,dom))>0: + if len(Evaluate(MDF_xpathStart,dom))>0: create=True @@ -507,6 +596,8 @@ class OSAS_Metadata(Folder): actualNode.appendChild(namenode) ret=newdoc.toxml(encoding='utf-8') + zLOG.LOG("OSAS_metadata (writeMetadata)",zLOG.INFO,"write: %s"%ret) + server.writeMetaDataFile(indexFile,ret) @@ -532,7 +623,7 @@ class OSAS_Metadata(Folder): if list=="": return None - listsplit=list.split("\n") + listsplit=[i.rstrip() for i in list.split("\n")] return listsplit def showHelp(self,refType,genericTag): @@ -563,4 +654,4 @@ def manage_addMetadata(self,id,shortDesc RESPONSE.redirect('manage_main') -InitializeClass(OSAS_Metadata) +