Annotation of OSA_system2/OSAS_metadata_old.py, revision 1.2

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>