Mercurial > hg > MetaDataProvider
comparison MetaData.py @ 3:3dadf0d89261
more renovation
author | casties |
---|---|
date | Tue, 26 Jul 2011 20:08:11 +0200 |
parents | ac8e119b25ec |
children | 8291255b1868 |
comparison
equal
deleted
inserted
replaced
2:ac8e119b25ec | 3:3dadf0d89261 |
---|---|
33 if node.nodeType == node.TEXT_NODE: | 33 if node.nodeType == node.TEXT_NODE: |
34 rc = rc + node.data | 34 rc = rc + node.data |
35 return rc | 35 return rc |
36 | 36 |
37 | 37 |
38 def normalizeBibtype(bt): | 38 def normalizeBibField(bt, underscore=True): |
39 """returns normalised bib type for looking up mappings""" | 39 """returns normalised bib type for looking up mappings""" |
40 bt = bt.strip().replace(' ', '-').lower() | 40 bt = bt.strip().replace(' ', '-').lower() |
41 if underscore: | |
42 bt = bt.replace('_', '-') | |
43 | |
41 return bt | 44 return bt |
42 | 45 |
43 def getBibdataFromDom(dom): | 46 def getBibdataFromDom(dom): |
44 """returns dict with all elements from bib-tag""" | 47 """returns dict with all elements from bib-tag""" |
45 bibinfo = {} | 48 bibinfo = {} |
46 bib = dom.find(".//meta/bib") | 49 bib = dom.find(".//meta/bib") |
47 if bib is not None: | 50 if bib is not None: |
48 # put type in @type | 51 # put type in @type |
49 type = bib.get('type') | 52 type = bib.get('type') |
50 bibinfo['@type'] = normalizedBibtype(type) | 53 bibinfo['@type'] = normalizeBibField(type) |
51 # put all subelements in dict | 54 # put all subelements in dict |
52 for e in bib: | 55 for e in bib: |
53 bibinfo[e.tag] = getText(e) | 56 bibinfo[normalizeBibField(e.tag)] = getText(e) |
54 | 57 |
55 return bibinfo | 58 return bibinfo |
56 | 59 |
57 def toString(list): | 60 def toString(list): |
58 ret=u"" | 61 ret=u"" |
100 meta_type='MetaData' | 103 meta_type='MetaData' |
101 security=ClassSecurityInfo() | 104 security=ClassSecurityInfo() |
102 manage_options = Folder.manage_options+( | 105 manage_options = Folder.manage_options+( |
103 {'label':'Main Config','action':'changeMetadataForm'}, | 106 {'label':'Main Config','action':'changeMetadataForm'}, |
104 {'label':'Import XML Schema','action':'importMetaDataExportXML'}, | 107 {'label':'Import XML Schema','action':'importMetaDataExportXML'}, |
105 {'label':'Select Fields for Display','action':'indicateDisplayFieldsForm'}, | 108 #{'label':'Select Fields for Display','action':'indicateDisplayFieldsForm'}, |
106 ) | 109 ) |
107 | 110 |
108 def __init__(self,id,shortDescription='',description='',fields=''): | 111 def __init__(self,id,shortDescription='',description='',fields=''): |
109 """initialize a new instance""" | 112 """initialize a new instance""" |
110 self.id = id | 113 self.id = id |
114 self.metaDataServerUrl="" # muss mit change metadata gesetzt werden | 117 self.metaDataServerUrl="" # muss mit change metadata gesetzt werden |
115 | 118 |
116 | 119 |
117 def correctPath(self,path,remove=None,prefix=None,cut=0): | 120 def correctPath(self,path,remove=None,prefix=None,cut=0): |
118 """convinience method um einen pfad zu veraendern""" | 121 """convinience method um einen pfad zu veraendern""" |
119 | |
120 if remove is not None: | 122 if remove is not None: |
121 path=path.replace(remove,'') | 123 path=path.replace(remove,'') |
122 if prefix is not None: | 124 if prefix is not None: |
123 path=os.path.join(prefix,path) | 125 path=os.path.join(prefix,path) |
124 | 126 |
129 | 131 |
130 def importMetaDataExportXML(self,importFile=None,RESPONSE=None): | 132 def importMetaDataExportXML(self,importFile=None,RESPONSE=None): |
131 """imports metadata from the metadataexportxml file""" | 133 """imports metadata from the metadataexportxml file""" |
132 | 134 |
133 if importFile is None: | 135 if importFile is None: |
134 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','importMetaDataExportXML.zpt')).__of__(self) | 136 pt=PageTemplateFile('zpt/importMetaDataExportXML', globals()).__of__(self) |
135 return pt() | 137 return pt() |
136 | 138 |
137 dom=xml.dom.minidom.parse(importFile) | 139 dom=ET.parse(importFile) |
138 self.createMappingFromDom(dom.getElementsByTagName("metadataExport")[0]) | 140 node = dom.getroot() |
141 if node.tag != 'metadataExport': | |
142 node = dom.find("metadataExport") | |
143 | |
144 self.createMappingFromDom(node) | |
139 | 145 |
140 if RESPONSE is not None: | 146 if RESPONSE is not None: |
141 RESPONSE.redirect('manage_main') | 147 RESPONSE.redirect('manage_main') |
142 | 148 |
143 | 149 |
145 """erzeuge ein Mapping aus dem der metadatanode des xmlformats, metadata ist ein metadataobject""" | 151 """erzeuge ein Mapping aus dem der metadatanode des xmlformats, metadata ist ein metadataobject""" |
146 | 152 |
147 if metadata is None: | 153 if metadata is None: |
148 metadata=self | 154 metadata=self |
149 | 155 |
150 nodes=metadatanode.childNodes | 156 nodes=metadatanode |
151 | 157 |
152 #erster schritt: anlegen der fieldlist | |
153 for node in nodes: | 158 for node in nodes: |
154 logging.debug("node: %s"%repr(node)) | 159 logging.debug("node: %s"%repr(node)) |
155 if node.tagName=="set": | 160 if node.tag=="set": |
156 set=node | 161 set=node |
157 if set.getAttribute('name')=='generic': | 162 id=set.get('name') |
158 list=[] | 163 list=[] |
159 for entry in set.getElementsByTagName('entry'): | 164 argList={} |
160 list.append(entry.getAttribute('genericName')) | 165 for entry in set: |
161 metadata.fieldList=list[0:] | 166 genericName=entry.get('genericName') |
162 | 167 if set.get('name')=='generic': |
163 else: | 168 # generic mapping doesn't have labels |
164 id=set.getAttribute('name').encode('utf-8') | 169 tag = genericName |
165 list=[] | 170 label = genericName |
166 argList={} | 171 else: |
167 for entry in set.getElementsByTagName('entry'): | 172 tag=entry.get('tag') |
168 genericName=entry.getAttribute('genericName') | 173 label=entry.get('label') |
169 tag=entry.getAttribute('tag') | 174 |
170 label=entry.getAttribute('label') | 175 if not tag: |
171 description=getTextFromNode(entry.childNodes) #TODO: clean | 176 # ignore empty tags |
172 argList[genericName]=(tag,label,description) | 177 continue |
173 metadata._setObject(id,MetaDataMapping(id,id,argList)) | 178 |
174 | 179 description=getText(entry) |
175 elif node.tagName=="metadata": | 180 argList[tag]={'tag':tag,'label':label,'explanation':description,'status':'optional'} |
181 | |
182 logging.debug("createMappingFromDom: new mapping=%s"%repr(argList)) | |
183 metadata._setObject(id,MetaDataMapping(id,id,argList)) | |
184 | |
185 elif node.tag=="metadata": | |
176 mn=node | 186 mn=node |
177 name=mn.getAttribute('name').encode('utf-8') | 187 name=mn.get('name') |
188 logging.debug("createMappingFromDom: new metadata=%s"%repr(name)) | |
178 metadata._setObject(name,MetaData(name,name)) | 189 metadata._setObject(name,MetaData(name,name)) |
179 mdObj=getattr(metadata,name) | 190 mdObj=getattr(metadata,name) |
180 mdObj.createMappingFromDom(mn) | 191 mdObj.createMappingFromDom(mn) |
181 | |
182 | 192 |
183 def getMDFromPathOrUrl(self,path): | 193 def getMDFromPathOrUrl(self,path): |
184 parsedurl = urlparse.urlparse(path) | 194 parsedurl = urlparse.urlparse(path) |
185 if parsedurl[0] != "": | 195 if parsedurl[0] != "": |
186 # has schema (e.g. http) | 196 # has schema (e.g. http) |
271 | 281 |
272 ret+="""<dc:%s>%s</dc:%s>"""%(md[0],xml.sax.saxutils.escape(md[1]),md[0]) | 282 ret+="""<dc:%s>%s</dc:%s>"""%(md[0],xml.sax.saxutils.escape(md[1]),md[0]) |
273 ret+="</bib>" | 283 ret+="</bib>" |
274 return ret | 284 return ret |
275 | 285 |
286 | |
287 def getBibMapping(self, bibtype): | |
288 """returns MetaDataMapping for bibtype""" | |
289 # try type as id | |
290 mapping = getattr(self.main.meta.bib, bibtype, None) | |
291 if mapping is None: | |
292 # try manually | |
293 mapFolder = self.main.meta.bib | |
294 for obj in mapFolder.objectValues(): | |
295 if obj.meta_type == "MetadataMapping": | |
296 # real type is in title | |
297 mapType = obj.title | |
298 if mapType == bibtype: | |
299 # try type as is | |
300 return obj | |
301 | |
302 if normalizeBibField(mapType, underscore=True) == normalizeBibField(bibtype, underscore=True): | |
303 # try normalized type without underscore | |
304 return obj | |
305 | |
306 return mapping | |
276 | 307 |
277 def getBibFields(self, bibdata): | 308 def getBibFields(self, bibdata): |
278 """returns dict with metadata description for bibdata""" | 309 """returns dict with metadata description for bibdata""" |
310 bibfields = {} | |
279 bibtype = bibdata['@type'] | 311 bibtype = bibdata['@type'] |
280 # get mapping from main/meta/bib | 312 # get mapping from main/meta/bib |
281 try: | 313 mapping = self.getBibMapping(bibtype) |
282 mapping=getattr(self.main.meta.bib, bibtype.lower()) | 314 if mapping is None: |
283 except: | 315 logging.error("getBibFields: no mapping for type: %s"%bibtype) |
284 logging.error("getStdMappedHash: no mapping for type: %s"%bibtype) | 316 return bibfields |
285 return mdHash | 317 |
286 | 318 # get field descriptions (copy so we can change it) |
287 # get field descriptions | 319 bibfields = mapping.getFields().copy() |
288 bibFields = mapping.getFields.copy() | |
289 # add field list | 320 # add field list |
290 bibFields['@fieldList'] = mapping.getFieldList() | 321 bibfields['@fieldList'] = mapping.getFieldList() |
291 | 322 |
292 return bibFields | 323 return bibfields |
293 | 324 |
294 | 325 def getBibMappedData(self, bibdata, allFields=False): |
295 def getFormatted(self, template, path=None, dom=None, bibdata=None): | 326 """returns dict with metadata descriptions and data for bibdata""" |
327 bibfields = self.getBibFields(bibdata) | |
328 mappedData = {} | |
329 mappedList = [] | |
330 for bk in bibfields.keys(): | |
331 # ignore descriptions without data | |
332 if not bibdata.get(bk, None): | |
333 continue | |
334 | |
335 # field description (copy so we can change it) | |
336 bf = bibfields[bk].copy() | |
337 # add value | |
338 bf['value'] = bibdata[bk] | |
339 mappedData[bk] = bf | |
340 mappedList.append(bk) | |
341 | |
342 if allFields and len(mappedData) < len(bibdata): | |
343 # add fields that were not in bibfields | |
344 for bk in bibdata.keys(): | |
345 if bk in mappedData or not bibdata[bk]: | |
346 continue | |
347 | |
348 mappedData[bk] = {'tag':bk, 'label':bk, 'value':bibdata[bk]} | |
349 mappedList.append(bk) | |
350 | |
351 mappedData['@fieldList'] = mappedList | |
352 return mappedData | |
353 | |
354 def getFormatted(self, template, path=None, dom=None, bibdata=None, allFields=False): | |
296 """returns string with document data formatted according to template. | 355 """returns string with document data formatted according to template. |
297 gets data from server or dom or pre-parsed bibdata.""" | 356 gets data from server or dom or pre-parsed bibdata.""" |
298 logging.debug("getFormatted(template=%s)"%(template)) | 357 logging.debug("getFormatted(template=%s)"%(template)) |
299 | 358 |
300 if dom is None and bibdata is None: | 359 if dom is None and bibdata is None: |
319 if tp is None: | 378 if tp is None: |
320 logging.error("getFormatted: no generic template either: %s"%(template)) | 379 logging.error("getFormatted: no generic template either: %s"%(template)) |
321 return "" | 380 return "" |
322 | 381 |
323 # put bib field descriptions in mdHash | 382 # put bib field descriptions in mdHash |
324 bibFields = self.getBibFields(bibdata) | 383 bibfields = self.getBibMappedData(bibdata, allFields=allFields) |
325 | 384 |
326 return tp(bibFields=bibFields, md=bibdata) | 385 return tp(mdmap=bibfields, md=bibdata) |
327 | 386 |
328 | 387 |
329 def getFormattedMetaData(self, path=None, dom=None, bibdata=None): | 388 def getFormattedMetaData(self, path=None, dom=None, bibdata=None): |
330 """get the metadafrom server""" | 389 """get the metadafrom server""" |
331 logging.debug("getFormattedMetaData(path=%s)"%path) | 390 logging.debug("getFormattedMetaData(path=%s)"%path) |
337 return self.getFormatted('metadata_template', path=path, dom=dom, bibdata=bibdata) | 396 return self.getFormatted('metadata_template', path=path, dom=dom, bibdata=bibdata) |
338 | 397 |
339 def getFormattedMetaDataExtended(self,path=None, dom=None, bibdata=None): | 398 def getFormattedMetaDataExtended(self,path=None, dom=None, bibdata=None): |
340 """get the metadafrom server""" | 399 """get the metadafrom server""" |
341 logging.debug("getFormattedMetaDataExtended(path=%s)"%path) | 400 logging.debug("getFormattedMetaDataExtended(path=%s)"%path) |
342 return self.getFormatted('metadata_extended_template', path=path, dom=dom, bibdata=bibdata) | 401 return self.getFormatted('metadata_extended_template', path=path, dom=dom, bibdata=bibdata, allFields=True) |
343 | 402 |
344 def getFormattedLabel(self,path=None, dom=None, bibdata=None): | 403 def getFormattedLabel(self,path=None, dom=None, bibdata=None): |
345 """get the metadafrom server""" | 404 """get the metadafrom server""" |
346 logging.debug("getFormattedLabel(%s)"%path) | 405 logging.debug("getFormattedLabel(%s)"%path) |
347 return self.getFormatted('label_template', path=path, dom=dom, bibdata=bibdata) | 406 return self.getFormatted('label_template', path=path, dom=dom, bibdata=bibdata) |
352 return self.getFormatted('metadata_template', path) | 411 return self.getFormatted('metadata_template', path) |
353 | 412 |
354 def getFormattedMetaDataExtendedFromServer(self,path): | 413 def getFormattedMetaDataExtendedFromServer(self,path): |
355 """get the metadafrom server""" | 414 """get the metadafrom server""" |
356 logging.debug("getFormattedMetaDataExtendedFromServer(path=%s)"%path) | 415 logging.debug("getFormattedMetaDataExtendedFromServer(path=%s)"%path) |
357 return self.getFormatted('metadata_extended_template', path) | 416 return self.getFormatted('metadata_extended_template', path=path, allFields=True) |
358 | 417 |
359 def getFormattedLabelFromServer(self,path): | 418 def getFormattedLabelFromServer(self,path): |
360 """get the metadafrom server""" | 419 """get the metadafrom server""" |
361 logging.debug("getFormattedLabelFromServer(%s)"%path) | 420 logging.debug("getFormattedLabelFromServer(%s)"%path) |
362 return self.getFormatted('label_template', path) | 421 return self.getFormatted('label_template', path) |