Annotation of OSA_system2/OSAS_metadata.py, revision 1.19

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
1.5       dwinter     9: import sys
1.1       dwinter    10: import xml.dom.minidom
1.4       dwinter    11: import xml.dom.pulldom
1.1       dwinter    12: import OSAS_helpers
1.16      dwinter    13: import logging
                     14: 
                     15: #ersetzt logging
                     16: def logger(txt,method,txt2):
                     17:     """logging"""
                     18:     logging.info(txt+ txt2)
                     19: 
                     20: 
1.4       dwinter    21: import string
1.8       dwinter    22: try:
                     23:     from xml.xpath import Evaluate
                     24: except:
                     25:     from Ft.Xml.XPath import Evaluate
1.4       dwinter    26: import xmlrpclib
                     27: 
                     28: from types import *
1.1       dwinter    29: 
                     30: class OSAS_MetadataMapping(SimpleItem):
                     31:     """Einfaches Mapping Object"""
                     32: 
                     33:     meta_type="OSAS_MetadataMapping__neu"
                     34: 
                     35:     def readFieldsFromParent(self):
                     36:         """read all elements from root"""
                     37:         
                     38:         return self.aq_parent.fieldList
                     39:     
                     40:     def __init__(self,id,title,arglist):
                     41:         """init
                     42:         @param id: id
                     43:         @param title: title fuer zope navigation
                     44:         @param arglist: dictionary mit Namen der zugelassenen generische Metadaten als key und Tripel  als Werte (human readable, tag version,explanation
                     45:         """
                     46:         self.id=id
                     47:         self.title=title
                     48:         for fieldName in arglist.keys():
                     49:             setattr(self,"md_"+fieldName,arglist[fieldName])
                     50:         
1.9       dwinter    51:            
1.1       dwinter    52:     manage_options = SimpleItem.manage_options+(
                     53:         {'label':'Main Config','action':'changeMetadataMappingForm'},
                     54:         )
                     55: 
                     56: 
                     57:     def showSetXML(self,RESPONSE=None):
                     58:         """prints out the mapping as XML"""
                     59:         ret="""<set name="%s">"""%self.title
                     60:         for fieldName in self.readFieldsFromParent():
                     61:             entry=getattr(self,"md_"+fieldName)
                     62:             if entry[2]=="": # no explanation of this field
                     63:                 ret+="""<entry genericName="%s" tag="%s" label="%s"/>"""%(fieldName,entry[0],entry[1])
                     64:             else:
                     65:                 ret+="""<entry genericName="%s" tag="%s" label="%s">%s</entry>"""%(fieldName,entry[0],entry[1],entry[2])
                     66:         ret+="</set>"
                     67: 
                     68:         if not RESPONSE:
                     69:             return ret
                     70:         else:
                     71:             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                     72:             return ret
                     73: 
                     74:     def getValue(self,fieldName):
                     75:         """get md value
                     76:         @param fieldName: Bezeichnung des gesuchten Metadatums
                     77:         @retunr: Value des Metadatums"""
1.4       dwinter    78:         
                     79:         ret= getattr(self,"md_"+fieldName,(None,None,None,None,None))
                     80:         if len(ret)!= 4: # alte MD haben keine info ueber optional/required und listen werte
                     81:             ret=ret+("","")
                     82:         return ret
                     83:     
1.1       dwinter    84: 
                     85:     def isEmptyValue(self,fieldName):
                     86:         """teste ob fielname in diesem Metadatenschema definiert ist"""
                     87:         field=getattr(self,"md_"+fieldName,'')
                     88:         if field[1]=='':
                     89:             return 0
                     90:         else:
                     91:             return 1
                     92:         
                     93:     def generateMappingHash(self):
                     94:         """erzeugen des dictionaries: generisches Feld -> Definition in diesem Schema"""
                     95:         hash={}
                     96:         for field in self.fieldList:
1.19    ! dwinter    97:             hash[field]=getattr(self,"md_"+field,'')
1.1       dwinter    98:         return hash
                     99: 
                    100:        
                    101:     
                    102:     def changeMetadataMappingForm(self):
                    103:         """change"""
                    104:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMetadataMapping.zpt')).__of__(self)
                    105:         return pt()
                    106:     
                    107:     def changeMetadataMapping(self,titleOfObject,RESPONSE=None):
                    108:         """change"""
                    109: 
                    110:         self.title=titleOfObject
                    111:         arglist=self.REQUEST.form
                    112:         
                    113:         for fieldName in self.readFieldsFromParent():
1.4       dwinter   114:             setattr(self,"md_"+fieldName,(arglist[fieldName],arglist['label_'+fieldName],arglist['explanation_'+fieldName],arglist['status_'+fieldName],arglist['values_'+fieldName]))
1.1       dwinter   115:             
                    116:             
                    117:         if RESPONSE is not None:
                    118:             RESPONSE.redirect('manage_main')
                    119: 
1.10      dwinter   120:     manage_workspace=changeMetadataMappingForm    
1.1       dwinter   121: 
                    122: def manage_addMetadataMappingForm(self):
                    123:     """interface for adding the OSAS_root"""
                    124:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetadataMappingForm.zpt')).__of__(self)
                    125: 
                    126:     return pt()
                    127: 
                    128: def manage_addMetadataMapping(self,idOfObject,titleOfObject,RESPONSE=None):
                    129:     """add the OSAS_root"""
                    130:     
                    131:     argList={}
                    132:     for arg in self.fieldList:
                    133:         if not (arg in ['idOfObject','titleOfObject']):
1.12      casties   134:             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])
1.1       dwinter   135:             
                    136:     newObj=OSAS_MetadataMapping(idOfObject,titleOfObject,argList)
                    137:     self._setObject(idOfObject,newObj)
                    138:     if RESPONSE is not None:
                    139:         RESPONSE.redirect('manage_main')
                    140: 
                    141:    
                    142: 
                    143: class OSAS_Metadata(Folder):
1.17      casties   144:     """Foldertype enthaelt methoden zur Halbautomatischen Erstellung von Metadatenfiles"""
1.1       dwinter   145:     security=ClassSecurityInfo()
                    146:     
1.4       dwinter   147:     def __init__(self,id,shortDescription,description,fields):
1.1       dwinter   148:         """initialize a new instance"""
                    149:         self.id = id
1.4       dwinter   150:         self.shortDescription =shortDescription #label fuer link auf add page
1.1       dwinter   151:         self.description=description #description of the method for link page
                    152:         self.fieldList=fields.split(",")[0:]
                    153:         
                    154:     meta_type='OSAS_Metadata__neu'
                    155: 
                    156:     manage_options = Folder.manage_options+(
                    157:         {'label':'Main Config','action':'changeMetadataForm'},
                    158:         {'label':'Import XML Schema','action':'importXMLSchemaForm'},
                    159:         {'label':'Select Fields for Display','action':'indicateDisplayFieldsForm'},
                    160:         )
                    161: 
                    162:     def showGenericXML(self,RESPONSE=None):
                    163:         """show generic fields as XML"""
                    164:         ret="""<set name="%s">"""%"generic"
                    165:         for field in self.fieldList:
                    166:             ret+="""<entry genericName="%s"/>"""%field
                    167: 
                    168:         ret+="</set>"
                    169:         
                    170:         if not RESPONSE:
                    171:             return ret
                    172:         else:
                    173:             self.REQUEST.RESPONSE.setHeader('Content-Type','text/xml')
                    174:             return ret
1.18      dwinter   175:     
                    176:   
                    177:     def showOverviewXML(self,RESPONSE=None,wrapped=False):
1.1       dwinter   178:         """gives an overview over the Metadata stored in this folder"""
1.18      dwinter   179:         ret=""
                    180:         if wrapped:
                    181:             ret+="""<metadataExport>"""
                    182:         ret+="""<metadata name="%s">"""%self.getId()
1.1       dwinter   183:         ret+=self.showGenericXML()
1.18      dwinter   184:         for entry in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping__neu']):
1.1       dwinter   185:             ret+=entry[1].showSetXML()
                    186: 
1.18      dwinter   187:         for entry in self.ZopeFind(self,obj_metatypes=['OSAS_Metadata__neu']):
                    188:             ret+=entry[1].showOverviewXML()
                    189: 
1.1       dwinter   190:         ret+="</metadata>"
                    191: 
1.18      dwinter   192:         if wrapped:
                    193:             ret+="""</metadataExport>"""
1.1       dwinter   194:         if not RESPONSE:
                    195:             return ret
                    196:         else:
1.18      dwinter   197:             RESPONSE.setHeader('Content-Type','text/xml')
1.1       dwinter   198:             return ret
                    199:         
                    200:     def generateMappingList(self):
                    201:         """Erzeuge Mapping"""
                    202:         mapping={}
1.10      dwinter   203: 
1.1       dwinter   204:         for dict in self.__dict__:
                    205:             #print dict
                    206:             obj=getattr(self,dict)
                    207:             if hasattr(obj,'meta_type'):
1.18      dwinter   208:                 logging.debug("generateMappungList read type:"+repr(obj.meta_type))
                    209:                 if ((obj.meta_type=="OSAS_MetadataMapping__neu") or (obj.meta_type=="MetadataMapping")): #metadatamapping is the newer type
                    210:                     logging.debug("generateMappungListadded:"+repr(obj.getId()))
1.1       dwinter   211:                     mapping[obj.getId()]=obj.generateMappingHash()
1.10      dwinter   212:         
1.1       dwinter   213:         return mapping
                    214:     
                    215:     def generateMappingForType(self,type,clean="yes"):
                    216:         """erzeuge spezifisches Mapping"""
1.10      dwinter   217:         
1.1       dwinter   218:         hash=self.generateMappingList()
1.18      dwinter   219:         logging.debug("generateMappingForType:"+type)
1.10      dwinter   220:         for key in hash.keys():
1.18      dwinter   221:             logging.debug("generateMappingForType comparing:"+key.lower()+type.lower())
1.10      dwinter   222:             if (key.lower() == type.lower()):
                    223:                 if clean=="yes":
                    224:                     temp={}
                    225:                     for x in hash[key].keys():
                    226:                         if not hash[key][x]=="":
                    227:                             temp[x]=hash[key][x]
                    228:                     return temp
                    229:                 else:
                    230:     
                    231:                     return hash[key]
                    232:             
                    233:         return {}
1.1       dwinter   234: 
                    235:     def getFieldList(self):
                    236:         """erzeuge string aus fields"""
                    237:         try:
                    238:             return string.join(self.fieldList,",")
                    239:         except:
                    240:             return ""
                    241:         
1.12      casties   242:     security.declarePublic('getFields')
1.1       dwinter   243:     def getFields(self):
                    244:         """ausgabe der Felder"""
                    245:         return self.fieldList
                    246: 
                    247:     def getTypeTitle(self,id):
                    248:         """Title von ID"""
                    249:         try:
                    250:             obj=getattr(self,id)
                    251:             return obj.title
                    252:         except:
                    253:             return id
1.4       dwinter   254: 
                    255:     def getType(self,type):
                    256:         """gib metadataobject type zurueck"""
                    257: 
                    258:         for obj in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping__neu']):
                    259:             if obj[0]==type:
                    260:                 return obj
                    261:         return (self.id,self)
                    262: 
                    263:         
1.1       dwinter   264:         
                    265:     def getStoredTypes(self):
1.17      casties   266:         """Gebe gespeicherte typen zurueck"""
1.1       dwinter   267:         
                    268:         types=[]
                    269: 
1.13      dwinter   270:         for obj in self.ZopeFind(self,obj_metatypes=['OSAS_MetadataMapping__neu']):
                    271:        if obj[1].title=="":
                    272:        title=obj[1].id
                    273:        else:
                    274:        title=obj[1].title
                    275:        types.append((obj[1].id, title, obj[1]))
1.1       dwinter   276: 
                    277:         return types
                    278: 
                    279:     def indicateDisplayFieldsForm(self):
                    280:         """form zur Makierung der Felder die in der Browserumgebung angezeigt werden"""
                    281:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','indicateDisplayFieldsForm.zpt')).__of__(self)
                    282:         return pt()
                    283: 
                    284:     def indicateDisplayFields(self,displayFields,RESPONSE=None):
                    285:         """set Displayfields
                    286:         @param displayFields: Liste von Felder die im Browserenvironment angezeigt werden
                    287:         """
                    288:         self.displayFields=OSAS_helpers.toList(displayFields)
                    289:         if RESPONSE is not None:
                    290:             RESPONSE.redirect('manage_main')
                    291: 
1.3       dwinter   292:     def getDisplayFieldsAsStr(self,indexMeta):
1.4       dwinter   293:         ret=[]
1.9       dwinter   294:         try:
1.6       dwinter   295:          if indexMeta and not (indexMeta==""):
1.5       dwinter   296:             dom=xml.dom.pulldom.parseString(indexMeta)
1.4       dwinter   297: 
1.5       dwinter   298:             for (event,node) in dom:
1.4       dwinter   299: 
1.5       dwinter   300:                 if event == xml.dom.pulldom.START_ELEMENT and node.tagName=="bib":
                    301:                     dom.expandNode(node)
1.4       dwinter   302: 
1.5       dwinter   303:                     try:
                    304:                         type=node.getAttribute('type')
                    305:                         mapping=getattr(self,type).generateMappingHash()
                    306:                     except:
                    307:                         type='generic'
                    308:                         mapping=getattr(self,type).generateMappingHash()
1.4       dwinter   309: 
1.5       dwinter   310:                     for field in self.displayFields:
                    311:                         try:
                    312:                             ret.append(OSAS_helpers.getText(node.getElementsByTagName(mapping[field][0])[0].childNodes))
                    313:                         except:
                    314:                             """nothing"""
1.4       dwinter   315: 
1.5       dwinter   316:                     return "; ".join(ret)
1.6       dwinter   317:          else:
1.5       dwinter   318:             return ""
1.9       dwinter   319:         except:
                    320:             return ""
1.4       dwinter   321:     def getDisplayFieldsAsStrOLD(self,indexMeta):
1.17      casties   322:         """Gebe display fields als string zurueck
1.1       dwinter   323:         @param path: Pfad zum Object
                    324:         """
                    325:         ret=[]
                    326:         try:
1.3       dwinter   327:             dom=xml.dom.minidom.parseString(indexMeta)
1.1       dwinter   328:         except:
1.16      dwinter   329:             logger("OSAS_metadata (getDisplayFieldsAsStr)",logging.INFO,"Cannot parse: %s"%indexMeta)
1.1       dwinter   330:         try:
                    331:             bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
                    332:         except:
                    333:             return ""
                    334:         try:
                    335:             type=bib.getAttribute('type')
                    336:             mapping=getattr(self,type).generateMappingHash()
                    337:         except:
                    338:             type='generic'
                    339:             mapping=getattr(self,type).generateMappingHash()
                    340: 
                    341:         for field in self.displayFields:
                    342:             try:
                    343:                 ret.append(OSAS_helpers.getText(bib.getElementsByTagName(mapping[field][0])[0].childNodes))
                    344:             except:
                    345:                 """nothing"""
                    346:                 
                    347:         return "; ".join(ret)
                    348: 
                    349:     security.declarePublic('changeMetadataForm')
                    350:     def changeMetadataForm(self):
                    351:         """Main configuration"""
                    352:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMetadata.zpt')).__of__(self)
                    353:         return pt()
                    354:     
                    355:     security.declarePublic('changeMetadata')
1.4       dwinter   356:     def changeMetadata(self,shortDescription,description,fields,RESPONSE=None):
1.1       dwinter   357:         """Change Metadata"""
1.4       dwinter   358:         self.shortDescription=shortDescription
1.1       dwinter   359:         self.description=description
                    360:         self.fieldList=fields.split(",")[0:]
                    361:         if RESPONSE is not None:
                    362:             RESPONSE.redirect('manage_main')
                    363: 
                    364:     security.declarePublic('index_html')
                    365: 
                    366:     def importXMLSchemaForm(self):
                    367:         """form"""
                    368:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importXMLSchemaForm.zpt')).__of__(self)
                    369:         return pt()
                    370: 
1.4       dwinter   371:     
1.1       dwinter   372:     def importXMLSchema(self,file,RESPONSE=None):
                    373:        """import xmlschema, Metadatenschema wird eingelesen und entsprechende Metadatenmappings angelegt."""
                    374: 
                    375:        dom=xml.dom.minidom.parse(file)
                    376:        sets=dom.getElementsByTagName('set')
                    377:        #erster schritt: anlegen der fieldlist
                    378:        for set in sets:
                    379:            if set.getAttribute('name')=='generic':
                    380:                list=[]
                    381:                for entry in set.getElementsByTagName('entry'):
                    382:                    list.append(entry.getAttribute('genericName'))
                    383:                self.fieldList=list[0:]
                    384: 
                    385:        #zweiter schritt: anlegen der mapping
                    386:        for set in sets:
                    387:            id=set.getAttribute('name').encode('utf-8')
                    388:            list=[]
                    389:            argList={}
                    390:            for entry in set.getElementsByTagName('entry'):
                    391:                genericName=entry.getAttribute('genericName')
                    392:                tag=entry.getAttribute('tag')
                    393:                label=entry.getAttribute('label')
                    394:                description=OSAS_helpers.getText(entry.childNodes)
                    395:                argList[genericName]=(tag,label,description)
                    396:            self._setObject(id,OSAS_MetadataMapping(id,id,argList))
                    397:            if RESPONSE:
                    398:                RESPONSE.write("Wrote: %s"%id)
1.4       dwinter   399: 
                    400: 
                    401:     def createMetadataFragment(self,type,path,prefix="",presets={}):
                    402:         """fragment"""
                    403:         self.REQUEST.SESSION['MDF_type']=type
                    404:         self.REQUEST.SESSION['MDF_path']=path
                    405:         self.REQUEST.SESSION['MDF_prefix']=prefix
                    406:         self.REQUEST.SESSION['MDF_presets']=presets
                    407: 
                    408:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetadataForm_fragment.zpt')).__of__(self)
                    409:         return pt()
                    410: 
                    411:     def createMetadataForm(self,type="",path=""):
                    412:         """createMetadataForm"""
                    413:         self.REQUEST.SESSION['MDF_type']=type
                    414:         self.REQUEST.SESSION['MDF_path']=path
                    415: 
                    416:         
                    417:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetadataForm_template.zpt')).__of__(self)
                    418:         return pt()
                    419: 
1.7       dwinter   420:     def readMetadata(self,MDF_path,MDF_type,MDF_prefix="",MDF_xpathStart="", MDF_addPath=None,MDF_identifyFields=None,newdoc=None,actualNode=None):
                    421: 
                    422:         if type(MDF_path)==ListType:
                    423:                 MDF_path=MDF_path[0]
                    424: 
                    425:         indexFile=os.path.join(MDF_path,'index.meta')
                    426: 
                    427:         server=xmlrpclib.Server(self.serverUrl)
                    428:         
                    429:         documentStr=server.getFile(indexFile)
                    430:         
                    431:         if documentStr:
                    432:             newdoc=xml.dom.minidom.parseString(documentStr)
                    433:             dom=newdoc.documentElement
                    434:             actualNode=dom
                    435:         else:
                    436:             return {}
                    437: 
                    438:         if self.containerTag=="":
                    439:             containerTag="doc"
                    440:         else:
                    441:             containerTag=self.containerTag
                    442:             
                    443:         if MDF_xpathStart=="":
                    444:             dom=newdoc.documentElement
                    445:             actualNode=dom
                    446:         else:
                    447:             #try to find xpath
                    448:             if MDF_identifyFields:
                    449:                 query=[]
                    450:                 for field in MDF_identifyFields.keys():
                    451: 
                    452:                     query.append("""(%s="%s")"""%(field,MDF_identifyFields[field]))
                    453:                 querystr=" and ".join(query)
                    454:                 xpathStr=MDF_xpathStart+"[%s]"%querystr
                    455:                 
                    456:             else:
                    457:                 xpathStr=MDF_xpathStart
                    458: 
                    459: 
1.8       dwinter   460:             xpathNodes=Evaluate(xpathStr,actualNode)
1.7       dwinter   461:             
                    462: 
                    463:             if len(xpathNodes)>0:
                    464:                 actualNode=xpathNodes[0]
                    465:             else:
                    466:                 return {}
                    467: 
                    468:         ret={}
                    469:         for node in actualNode.childNodes:
                    470:             name=node.tagName
                    471:             text=OSAS_helpers.getText(node.childNodes)
                    472:             ret[name]=text
                    473: 
                    474:         return ret
                    475:         
1.4       dwinter   476:     def writeMetadata(self,MDF_path,MDF_type,form,MDF_prefix="",MDF_xpathStart="", MDF_addPath=None,MDF_identifyFields=None,newdoc=None,actualNode=None):
                    477:         """writeMetadata"""
                    478:         #MDF_path="/tmp/index.meta"
                    479:         if type(MDF_path)==ListType:
                    480:                 MDF_path=MDF_path[0]
                    481: 
1.7       dwinter   482: 
1.4       dwinter   483:         indexFile=os.path.join(MDF_path,'index.meta')
1.7       dwinter   484:         
1.4       dwinter   485:         server=xmlrpclib.Server(self.serverUrl)
                    486:         if newdoc:
                    487:             if not actualNode: actualNode=newdoc
                    488:             dom=newdoc
                    489:         else:
                    490:             documentStr=server.getFile(indexFile)
1.5       dwinter   491: 
1.4       dwinter   492:             if documentStr:
1.5       dwinter   493: 
1.4       dwinter   494:                 newdoc=xml.dom.minidom.parseString(documentStr)
                    495:                 dom=newdoc.documentElement
                    496:                 actualNode=dom
                    497: 
                    498: 
                    499:             else:
1.5       dwinter   500: 
1.4       dwinter   501:                 impl=xml.dom.minidom.getDOMImplementation()
                    502:                 newdoc=None
                    503: 
                    504:         
                    505:         if self.containerTag=="":
                    506:             containerTag="doc"
                    507:         else:
                    508:             containerTag=self.containerTag
                    509: 
                    510:         create=None
                    511:         if MDF_xpathStart=="":
                    512:             if not newdoc:
                    513:                 newdoc=impl.createDocument(None,containerTag,None)
                    514:             dom=newdoc.documentElement
                    515:             actualNode=dom
                    516:         else:
                    517: 
                    518:             #try to find xpath
                    519:             if MDF_identifyFields:
                    520:                 query=[]
                    521:                 for field in MDF_identifyFields:
                    522: 
                    523:                     query.append("""(%s="%s")"""%(field,form[MDF_prefix+"MD_"+field]))
                    524:                 querystr=" and ".join(query)
                    525:                 xpathStr=MDF_xpathStart+"[%s]"%querystr
                    526:                 
                    527:             else:
                    528:                 xpathStr=MDF_xpathStart
                    529: 
1.5       dwinter   530: 
1.8       dwinter   531:             xpathNodes=Evaluate(xpathStr,actualNode)
1.4       dwinter   532:             
                    533: 
                    534: 
                    535: 
                    536:             if len(xpathNodes)>0:
                    537:                 actualNode=xpathNodes[0]
                    538: 
                    539:             else:
                    540:                 #existiert nicht dann neue erzeugen
                    541: 
1.8       dwinter   542:                 if len(Evaluate(MDF_xpathStart,dom))>0:
1.4       dwinter   543: 
                    544:                     create=True
                    545:                 
                    546:                 splitted=MDF_xpathStart.split("/")
                    547:                 base=""
                    548:                 for element in splitted:
                    549: 
                    550:                     if not (element=="") and not (element==containerTag):
                    551:                         base="/".join([base,element])
                    552:                         
                    553:                         if not newdoc:
                    554:                             newdoc=impl.createDocument(None,element,None)
                    555:                             actualNode=newdoc.documentElement
                    556:                             dom=actualNode
                    557:                         else:
                    558:                             changed=None
                    559: 
                    560:                             if not (MDF_addPath==base):
                    561: 
                    562: 
                    563:                                 for childNode in actualNode.childNodes:
                    564:                                     if getattr(childNode,'tagName','')==element:
                    565:                                         actualNode=childNode
                    566:                                         changed=1
                    567: 
                    568:                                         if (os.path.normpath("/".join(["",containerTag,base]))==MDF_xpathStart) and create:
                    569:                                             actualNode=actualNode.parentNode
                    570:                                             changed=None
                    571: 
                    572:                             if not changed:
                    573:                                 namenode=newdoc.createElement(element)
                    574: 
                    575:                                 actualNode.appendChild(namenode)
                    576:                                 actualNode=namenode
                    577: 
                    578: 
                    579:             
                    580:         
                    581:         for name in self.REQUEST.form.keys():
                    582:             length=len(MDF_prefix)
                    583:             if MDF_type and not (MDF_type == ""):
                    584:                 actualNode.setAttribute("type",MDF_type)
                    585:             if name[0:3+length]==MDF_prefix+"MD_":
                    586:                 tagName=name[3+length:]
                    587: 
                    588:                 #CHECK if element exists
                    589:                 for childNode in actualNode.childNodes:
                    590:                     if getattr(childNode,'tagName','')==tagName:
                    591:                         actualNode.removeChild(childNode).unlink()
                    592:                 
                    593:                 namenode=newdoc.createElement(tagName)
                    594:                 namenodetext=newdoc.createTextNode(self.REQUEST.form[name])
                    595:                 namenode.appendChild(namenodetext)
                    596:                 actualNode.appendChild(namenode)
                    597:                 
                    598:         ret=newdoc.toxml(encoding='utf-8')
1.14      dwinter   599:         zLOG.LOG("OSAS_metadata (writeMetadata)",zLOG.INFO,"write: %s"%ret)
1.13      dwinter   600: 
1.4       dwinter   601: 
                    602:         server.writeMetaDataFile(indexFile,ret)
                    603: 
                    604: 
                    605:         return newdoc,actualNode
                    606: 
                    607:     def writeMetadataFile(self,MDF_path,MDF_type,MDF_xpathStart="",newdoc=None,actualNode=None):
                    608:         """writeMetaFile"""
                    609: 
                    610:         return self.writeMetadata(MDF_path,MDF_type,self.REQUEST.form,MDF_xpathStart=MDF_xpathStart,newdoc=newdoc,actualNode=actualNode)
                    611: 
1.1       dwinter   612:     
1.4       dwinter   613:     def isEmptyValue(self,fieldName):
                    614:         """im generischen fall stets falsch"""
                    615:         return 1
                    616: 
                    617:     def getValue(self,fieldName):
                    618:         """im generischen fall gleich fieldname"""
                    619:         return fieldName,fieldName,"","",""
                    620: 
                    621:     def getList(self,list):
                    622:         """return list"""
                    623: 
                    624:         if list=="":
                    625:             return None
1.15      casties   626:         listsplit=[i.rstrip() for i in list.split("\n")]
1.4       dwinter   627:         return listsplit
                    628: 
                    629:     def showHelp(self,refType,genericTag):
                    630:         """helptext"""
                    631:         for reference in self.ZopeFind(self):
                    632:             if reference[1].title==refType:
                    633:                 text=getattr(reference[1],'md_'+genericTag)[2]
                    634:                 return text
                    635:         return "NO EXPLANATION"
                    636: 
                    637:     def showHelpTag(self,url,reftype,item):
                    638:         """gen javascript for showhelp"""
                    639:         url2=url+'/showHelp?refType=%s&genericTag=%s'%(reftype,item)
                    640:         ret="""javascript:wd=window.open(\'%s\',\'Help\',\'width=300,height=250\');void(\'\');wd.focus();"""%url2
                    641:         return ret
                    642: 
                    643:         
1.1       dwinter   644: def manage_addMetadataForm(self):
                    645:     """interface for adding the OSAS_add_Metadata"""
                    646:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMetadataForm.zpt')).__of__(self)
                    647:     return pt()
                    648: 
1.4       dwinter   649: def manage_addMetadata(self,id,shortDescription,description,fields,RESPONSE=None):
1.1       dwinter   650:     """add the OSAS_root"""
1.4       dwinter   651:     newObj=OSAS_Metadata(id,shortDescription,description,fields)
1.1       dwinter   652:     self.Destination()._setObject(id,newObj)
                    653:     if RESPONSE is not None:
                    654:         RESPONSE.redirect('manage_main')
                    655: 
                    656:             
1.18      dwinter   657: 

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