Annotation of OSA_system2/OSAS_metadata.py, revision 1.1
1.1 ! dwinter 1: """ Classes for managing metadata"""
! 2:
! 3: from OFS.SimpleItem import SimpleItem
! 4: from Globals import InitializeClass,package_home
! 5: from OFS.Folder import Folder
! 6: from AccessControl import ClassSecurityInfo
! 7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
! 8: import os.path
! 9: import xml.dom.minidom
! 10: import OSAS_helpers
! 11: import zLOG
! 12:
! 13: class OSAS_MetadataMapping(SimpleItem):
! 14: """Einfaches Mapping Object"""
! 15:
! 16: meta_type="OSAS_MetadataMapping__neu"
! 17:
! 18: def readFieldsFromParent(self):
! 19: """read all elements from root"""
! 20:
! 21: return self.aq_parent.fieldList
! 22:
! 23: def __init__(self,id,title,arglist):
! 24: """init
! 25: @param id: id
! 26: @param title: title fuer zope navigation
! 27: @param arglist: dictionary mit Namen der zugelassenen generische Metadaten als key und Tripel als Werte (human readable, tag version,explanation
! 28: """
! 29: self.id=id
! 30: self.title=title
! 31: for fieldName in arglist.keys():
! 32: setattr(self,"md_"+fieldName,arglist[fieldName])
! 33:
! 34:
! 35: manage_options = SimpleItem.manage_options+(
! 36: {'label':'Main Config','action':'changeMetadataMappingForm'},
! 37: )
! 38:
! 39:
! 40: def showSetXML(self,RESPONSE=None):
! 41: """prints out the mapping as XML"""
! 42: ret="""<set name="%s">"""%self.title
! 43: for fieldName in self.readFieldsFromParent():
! 44: entry=getattr(self,"md_"+fieldName)
! 45: if entry[2]=="": # no explanation of this field
! 46: ret+="""<entry genericName="%s" tag="%s" label="%s"/>"""%(fieldName,entry[0],entry[1])
! 47: else:
! 48: ret+="""<entry genericName="%s" tag="%s" label="%s">%s</entry>"""%(fieldName,entry[0],entry[1],entry[2])
! 49: ret+="</set>"
! 50:
! 51: if not RESPONSE:
! 52: return ret
! 53: else:
! 54: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
! 55: return ret
! 56:
! 57: def getValue(self,fieldName):
! 58: """get md value
! 59: @param fieldName: Bezeichnung des gesuchten Metadatums
! 60: @retunr: Value des Metadatums"""
! 61:
! 62: return getattr(self,"md_"+fieldName,(None,None,None))
! 63:
! 64:
! 65: def isEmptyValue(self,fieldName):
! 66: """teste ob fielname in diesem Metadatenschema definiert ist"""
! 67: field=getattr(self,"md_"+fieldName,'')
! 68: if field[1]=='':
! 69: return 0
! 70: else:
! 71: return 1
! 72:
! 73: def generateMappingHash(self):
! 74: """erzeugen des dictionaries: generisches Feld -> Definition in diesem Schema"""
! 75: hash={}
! 76: for field in self.fieldList:
! 77: hash[field]=getattr(self,"md_"+field)
! 78: return hash
! 79:
! 80:
! 81:
! 82: def changeMetadataMappingForm(self):
! 83: """change"""
! 84: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMetadataMapping.zpt')).__of__(self)
! 85: return pt()
! 86:
! 87: def changeMetadataMapping(self,titleOfObject,RESPONSE=None):
! 88: """change"""
! 89:
! 90: self.title=titleOfObject
! 91: arglist=self.REQUEST.form
! 92:
! 93: for fieldName in self.readFieldsFromParent():
! 94: setattr(self,"md_"+fieldName,(arglist[fieldName],arglist['label_'+fieldName],arglist['explanation_'+fieldName]))
! 95:
! 96:
! 97: if RESPONSE is not None:
! 98: RESPONSE.redirect('manage_main')
! 99:
! 100:
! 101:
! 102: def manage_addMetadataMappingForm(self):
! 103: """interface for adding the OSAS_root"""
! 104: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetadataMappingForm.zpt')).__of__(self)
! 105:
! 106: return pt()
! 107:
! 108: def manage_addMetadataMapping(self,idOfObject,titleOfObject,RESPONSE=None):
! 109: """add the OSAS_root"""
! 110:
! 111: argList={}
! 112: for arg in self.fieldList:
! 113: if not (arg in ['idOfObject','titleOfObject']):
! 114: argList[arg]=(self.REQUEST.form[arg],self.REQUEST.form['label_'+arg],self.REQUEST.form['explanation_'+arg])
! 115:
! 116: newObj=OSAS_MetadataMapping(idOfObject,titleOfObject,argList)
! 117: self._setObject(idOfObject,newObj)
! 118: if RESPONSE is not None:
! 119: RESPONSE.redirect('manage_main')
! 120:
! 121:
! 122:
! 123: class OSAS_Metadata(Folder):
! 124: """Foldertype enthält methoden zur Halbautomatischen Erstellung von Metadatenfiles"""
! 125: security=ClassSecurityInfo()
! 126:
! 127: def __init__(self,id,linklabel,description,fields):
! 128: """initialize a new instance"""
! 129: self.id = id
! 130: self.linklabel =linklabel #label fuer link auf add page
! 131: self.description=description #description of the method for link page
! 132: self.fieldList=fields.split(",")[0:]
! 133:
! 134: meta_type='OSAS_Metadata__neu'
! 135:
! 136: manage_options = Folder.manage_options+(
! 137: {'label':'Main Config','action':'changeMetadataForm'},
! 138: {'label':'Import XML Schema','action':'importXMLSchemaForm'},
! 139: {'label':'Select Fields for Display','action':'indicateDisplayFieldsForm'},
! 140: )
! 141:
! 142: def showGenericXML(self,RESPONSE=None):
! 143: """show generic fields as XML"""
! 144: ret="""<set name="%s">"""%"generic"
! 145: for field in self.fieldList:
! 146: ret+="""<entry genericName="%s"/>"""%field
! 147:
! 148: ret+="</set>"
! 149:
! 150: if not RESPONSE:
! 151: return ret
! 152: else:
! 153: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
! 154: return ret
! 155:
! 156: def showOverviewXML(self,RESPONSE):
! 157: """gives an overview over the Metadata stored in this folder"""
! 158: ret="""<metadata name="%s">"""%self.getId()
! 159: ret+=self.showGenericXML()
! 160: for entry in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping']):
! 161: ret+=entry[1].showSetXML()
! 162:
! 163: ret+="</metadata>"
! 164:
! 165: if not RESPONSE:
! 166: return ret
! 167: else:
! 168: self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
! 169: return ret
! 170:
! 171: def generateMappingList(self):
! 172: """Erzeuge Mapping"""
! 173: mapping={}
! 174: for dict in self.__dict__:
! 175: #print dict
! 176: obj=getattr(self,dict)
! 177: if hasattr(obj,'meta_type'):
! 178: if obj.meta_type=="OSAS_MetadataMapping":
! 179: mapping[obj.getId()]=obj.generateMappingHash()
! 180: return mapping
! 181:
! 182: def generateMappingForType(self,type,clean="yes"):
! 183: """erzeuge spezifisches Mapping"""
! 184: hash=self.generateMappingList()
! 185: if hash.has_key(type):
! 186: if clean=="yes":
! 187: temp={}
! 188: for x in hash[type].keys():
! 189: if not hash[type][x]=="":
! 190: temp[x]=hash[type][x]
! 191: return temp
! 192: else:
! 193: return hash[type]
! 194:
! 195: else:
! 196: return {}
! 197:
! 198: def getFieldList(self):
! 199: """erzeuge string aus fields"""
! 200: try:
! 201: return string.join(self.fieldList,",")
! 202: except:
! 203: return ""
! 204:
! 205: def getFields(self):
! 206: """ausgabe der Felder"""
! 207: return self.fieldList
! 208:
! 209: def getTypeTitle(self,id):
! 210: """Title von ID"""
! 211: try:
! 212: obj=getattr(self,id)
! 213: return obj.title
! 214: except:
! 215: return id
! 216:
! 217: def getStoredTypes(self):
! 218: """Gebe gespeicherte typen zurück"""
! 219:
! 220: types=[]
! 221:
! 222: for obj in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping_neu']):
! 223: if obj.title=="":
! 224: title=obj.id
! 225: else:
! 226: title=obj.title
! 227: types.append((obj.id,title))
! 228:
! 229: return types
! 230:
! 231: def indicateDisplayFieldsForm(self):
! 232: """form zur Makierung der Felder die in der Browserumgebung angezeigt werden"""
! 233: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','indicateDisplayFieldsForm.zpt')).__of__(self)
! 234: return pt()
! 235:
! 236: def indicateDisplayFields(self,displayFields,RESPONSE=None):
! 237: """set Displayfields
! 238: @param displayFields: Liste von Felder die im Browserenvironment angezeigt werden
! 239: """
! 240: self.displayFields=OSAS_helpers.toList(displayFields)
! 241: if RESPONSE is not None:
! 242: RESPONSE.redirect('manage_main')
! 243:
! 244: def getDisplayFieldsAsStr(self,path):
! 245: """Gebe display fields als string zurück
! 246: @param path: Pfad zum Object
! 247: """
! 248: ret=[]
! 249: if not os.path.exists(os.path.join(path,'index.meta')):
! 250: return ""
! 251: try:
! 252: dom=xml.dom.minidom.parse(os.path.join(path,'index.meta'))
! 253: except:
! 254: zLOG.LOG("OSAS_metadata (getDisplayFieldsAsStr)",zLOG.INFO,"Cannot parse: %s"%path)
! 255: try:
! 256: bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
! 257: except:
! 258: return ""
! 259: try:
! 260: type=bib.getAttribute('type')
! 261: mapping=getattr(self,type).generateMappingHash()
! 262: except:
! 263: type='generic'
! 264: mapping=getattr(self,type).generateMappingHash()
! 265:
! 266: for field in self.displayFields:
! 267: try:
! 268: ret.append(OSAS_helpers.getText(bib.getElementsByTagName(mapping[field][0])[0].childNodes))
! 269: except:
! 270: """nothing"""
! 271:
! 272: return "; ".join(ret)
! 273:
! 274: security.declarePublic('changeMetadataForm')
! 275: def changeMetadataForm(self):
! 276: """Main configuration"""
! 277: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMetadata.zpt')).__of__(self)
! 278: return pt()
! 279:
! 280: security.declarePublic('changeMetadata')
! 281: def changeMetadata(self,linklabel,description,fields,RESPONSE=None):
! 282: """Change Metadata"""
! 283: self.linklabel=linklabel
! 284: self.description=description
! 285: self.fieldList=fields.split(",")[0:]
! 286: if RESPONSE is not None:
! 287: RESPONSE.redirect('manage_main')
! 288:
! 289: security.declarePublic('index_html')
! 290:
! 291: def importXMLSchemaForm(self):
! 292: """form"""
! 293: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importXMLSchemaForm.zpt')).__of__(self)
! 294: return pt()
! 295:
! 296: def importXMLSchema(self,file,RESPONSE=None):
! 297: """import xmlschema, Metadatenschema wird eingelesen und entsprechende Metadatenmappings angelegt."""
! 298:
! 299: dom=xml.dom.minidom.parse(file)
! 300: sets=dom.getElementsByTagName('set')
! 301: #erster schritt: anlegen der fieldlist
! 302: for set in sets:
! 303: if set.getAttribute('name')=='generic':
! 304: list=[]
! 305: for entry in set.getElementsByTagName('entry'):
! 306: list.append(entry.getAttribute('genericName'))
! 307: self.fieldList=list[0:]
! 308:
! 309: #zweiter schritt: anlegen der mapping
! 310: for set in sets:
! 311: id=set.getAttribute('name').encode('utf-8')
! 312: list=[]
! 313: argList={}
! 314: for entry in set.getElementsByTagName('entry'):
! 315: genericName=entry.getAttribute('genericName')
! 316: tag=entry.getAttribute('tag')
! 317: label=entry.getAttribute('label')
! 318: description=OSAS_helpers.getText(entry.childNodes)
! 319: argList[genericName]=(tag,label,description)
! 320: self._setObject(id,OSAS_MetadataMapping(id,id,argList))
! 321: if RESPONSE:
! 322: RESPONSE.write("Wrote: %s"%id)
! 323:
! 324:
! 325: def manage_addMetadataForm(self):
! 326: """interface for adding the OSAS_add_Metadata"""
! 327: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetadataForm.zpt')).__of__(self)
! 328: return pt()
! 329:
! 330: def manage_addMetadata(self,id,linklabel,description,fields,RESPONSE=None):
! 331: """add the OSAS_root"""
! 332: newObj=OSAS_Metadata(id,linklabel,description,fields)
! 333: self.Destination()._setObject(id,newObj)
! 334: if RESPONSE is not None:
! 335: RESPONSE.redirect('manage_main')
! 336:
! 337:
! 338: InitializeClass(OSAS_Metadata)
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>