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>