comparison MetaDataFolder.py @ 28:40508e672841

richer metadata for bib. still not sufficient though.
author casties
date Mon, 20 Aug 2012 20:14:45 +0200
parents a0d273542509
children b3428e281ee2
comparison
equal deleted inserted replaced
27:a0d273542509 28:40508e672841
18 if underscore: 18 if underscore:
19 bt = bt.replace('_', '-') 19 bt = bt.replace('_', '-')
20 20
21 return bt 21 return bt
22 22
23 def OLDgetBibdataFromDom(dom):
24 """returns dict with all elements from bib-tag"""
25 bibinfo = {}
26 bib = dom.find(".//meta/bib")
27 if bib is not None:
28 # put type in @type
29 type = bib.get('type')
30 bibinfo['@type'] = normalizeBibField(type)
31 # put all subelements in dict
32 for e in bib:
33 bibinfo[normalizeBibField(e.tag)] = getText(e)
34
35 return bibinfo
36
37 def toString(list): 23 def toString(list):
38 ret=u"" 24 ret=u""
39 25
40 for l in list: 26 for l in list:
41 ret+=unicode(l) 27 ret+=unicode(l)
42 28
43 return ret 29 return ret
44
45 def dcMetaDataToHash(mdSet):
46 """Convenience Function for creates a hash from the DCMetadataset
47 @param mdSet: String containing DCMetadata informmation
48 currently only in the format getDCMetadata of this module"""
49
50 NSS = {
51 'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
52 'dc': 'http://dublincore.org/documents/dcmi-namespace/',
53 'owl':"http://www.w3.org/2002/07/owl#",
54 'rdfs':"http://www.w3.org/2000/01/rdf-schema#"
55 }
56 ret={}
57 import StringIO
58 import sys
59 buffer= StringIO.StringIO(mdSet)
60 try:
61 md = amara.parse(buffer,prefixes=NSS)
62 except:
63 logging.error("Error: %s (%s)"%(sys.exc_info()[0],sys.exc_info()[1]))
64
65 ret["error"]=mdSet
66 return ret
67
68 ret["title"] = toString(md.xml_xpath("//dc:title/text()"))
69 ret["creator"] =toString(md.xml_xpath("//dc:creator/text()"))
70 ret["date"] = toString(md.xml_xpath("//dc:date/text()"))
71
72 return ret
73
74 30
75 class MetaDataFolder(Folder): 31 class MetaDataFolder(Folder):
76 """provides methods for managing complete metadata structures""" 32 """provides methods for managing complete metadata structures"""
77 meta_type='MetaDataFolder' 33 meta_type='MetaDataFolder'
78 security=ClassSecurityInfo() 34 security=ClassSecurityInfo()
229 return dri.get('@text', None) 185 return dri.get('@text', None)
230 186
231 return None 187 return None
232 188
233 189
234 def getBibData(self, path=None, dom=None): 190 def getBibData(self, path=None, dom=None, all=False, recursive=0):
235 """returns contents of bib tag as dict""" 191 """returns contents of bib tag as dict"""
236 return self.resource.meta.bib.getData(path=path, dom=dom) 192 return self.resource.meta.bib.getData(path=path, dom=dom, all=all, recursive=recursive)
237 193
238 def getBibMapping(self, bibtype): 194 def getBibMapping(self, bibtype):
239 """returns MetaDataMapping for resource/meta/bib of bibtype""" 195 """returns MetaDataMapping for resource/meta/bib of bibtype"""
240 return self.resource.meta.bib.getMapping(bibtype) 196 return self.resource.meta.bib.getMapping(bibtype)
241 197
249 205
250 def getDCMappedData(self, bibdata): 206 def getDCMappedData(self, bibdata):
251 """returns dict with DC keys and data from bibdata""" 207 """returns dict with DC keys and data from bibdata"""
252 return self.resource.meta.bib.getDCMappedData(bibdata) 208 return self.resource.meta.bib.getDCMappedData(bibdata)
253 209
254 def getBibFormattedMetaData(self, path=None, dom=None, bibdata=None): 210 def getBibFormattedMetaData(self, path=None, dom=None, bibdata=None, bibxdata=None):
255 """get the metadafrom server""" 211 """get the metadafrom server"""
256 logging.debug("getBibFormattedMetaData(path=%s)"%path) 212 logging.debug("getBibFormattedMetaData(path=%s)"%path)
257 return self.resource.meta.bib.getFormatted('metadata_template', path=path, dom=dom, data=bibdata) 213 return self.resource.meta.bib.getFormatted('metadata_template', path=path, dom=dom, data=bibdata, xdata=bibxdata)
258 214
259 def getBibFormattedMetaDataExtended(self,path=None, dom=None, bibdata=None): 215 def getBibFormattedMetaDataExtended(self,path=None, dom=None, bibdata=None, bibxdata=None):
260 """get the metadafrom server""" 216 """get the metadafrom server"""
261 logging.debug("getBibFormattedMetaDataExtended(path=%s)"%path) 217 logging.debug("getBibFormattedMetaDataExtended(path=%s)"%path)
262 return self.resource.meta.bib.getFormatted('metadata_extended_template', path=path, dom=dom, data=bibdata, allFields=True) 218 return self.resource.meta.bib.getFormatted('metadata_extended_template', path=path, dom=dom, data=bibdata, xdata=bibxdata, allFields=True)
263 219
264 def getBibFormattedLabel(self,path=None, dom=None, bibdata=None): 220 def getBibFormattedLabel(self,path=None, dom=None, bibdata=None):
265 """get the metadafrom server""" 221 """get the metadafrom server"""
266 logging.debug("getBibFormattedLabel(%s)"%path) 222 logging.debug("getBibFormattedLabel(%s)"%path)
267 return self.resource.meta.bib.getFormatted('label_template', path=path, dom=dom, data=bibdata) 223 return self.resource.meta.bib.getFormatted('label_template', path=path, dom=dom, data=bibdata)
270 getFormattedMetaData = getBibFormattedMetaData 226 getFormattedMetaData = getBibFormattedMetaData
271 getFormattedMetaDataShort = getBibFormattedMetaData 227 getFormattedMetaDataShort = getBibFormattedMetaData
272 getFormattedMetaDataExtended = getBibFormattedMetaDataExtended 228 getFormattedMetaDataExtended = getBibFormattedMetaDataExtended
273 getFormattedLabel = getBibFormattedLabel 229 getFormattedLabel = getBibFormattedLabel
274 230
275 231
276 def OLDgetDCFormatted(self,path):
277 """get the metadata as dc set"""
278 logging.debug("getDCFormatted(path=%s)"%path)
279 namespace={ 'mpiwg': "http://www.mpiwg-berlin.mpg.de/ns/mpiwg"}
280 namespaceUsed=False
281
282 md = self.getMDFromPathOrUrl(path)
283 logging.debug("MD in XML"+md)
284 im = amara.parse(md, prefixes=namespace)
285
286 typePaths=im.xml_xpath('//bib/@type')
287 archimedes=False
288
289 if len(typePaths)<1:
290 typePaths=im.xml_xpath('//meta/archimedes') # sinderfall fuer veraltete index.meta files vom typ archimedes
291 if len(typePaths)>0:
292 type = "archimedes"
293 archimedes=True
294 else:
295 typePaths=im.xml_xpath('//mpiwg:bib/@type')
296 if len(typePaths)<1:
297 return ""
298 else:
299 namespaceUsed=True
300
301 type=unicode(typePaths[0])
302 else:
303 type=unicode(typePaths[0])
304 logging.info("got type:"+type)
305 try:
306 mapping=getattr(self.main.meta.bib,type.lower(),None)
307 except:
308 logging.error("getMetaDataFromServer no mapping for type: %s"%type)
309 return ""
310
311 try:
312 dcMapping=getattr(self.main.meta.bib,"dc",None)
313 except:
314 logging.error("getMetaDataFromServer no dc in meta/bib")
315 return ""
316
317 mds=mapping.generateMappingHash() # Hole das Mapping generisches Feld --> Feld im entsprechenden Typ
318 dcMds=dcMapping.generateMappingHash()
319
320 mdHash=[]
321 logging.debug("Value: %s"%repr(mds))
322
323 for key,valueTriple in mds.items():
324 value=valueTriple[0]
325 logging.debug("Value: %s"%repr(value))
326 logging.debug("Key: %s"%repr(key))
327 if value!="":
328 if not archimedes:
329 if namespaceUsed:
330 try:
331 v = im.xml_xpath('//mpiwg:bib/mpiwg:%s/text()'%value)
332 except:
333 logging.error('cannot do: //mpiwg:bib/mpiwg:%s/text()'%value)
334 else:
335 v = im.xml_xpath('//bib/%s/text()'%value)
336 else:
337 v = im.xml_xpath('//archimedes/%s/text()'%value)
338 if len(v) > 0:
339 dc=dcMds[key][0]
340
341 if (dc !="") and (value !=""):
342 logging.debug("%s--> : %s"%(repr(value),dc))
343 mdHash.append([dc,unicode(v[0])])
344
345 ret="""<bib xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"> """
346 ret+="<dc:type>%s</dc:type>"%type
347 for md in mdHash:
348
349 ret+="""<dc:%s>%s</dc:%s>"""%(md[0],xml.sax.saxutils.escape(md[1]),md[0])
350 ret+="</bib>"
351 return ret
352
353
354 changeMetaDataFolderForm = PageTemplateFile('zpt/changeMetaDataFolder',globals()) 232 changeMetaDataFolderForm = PageTemplateFile('zpt/changeMetaDataFolder',globals())
355 233
356 security.declarePublic('changeMetaDataFolder') 234 security.declarePublic('changeMetaDataFolder')
357 def changeMetaDataFolder(self,title,metaDataServerUrl,RESPONSE=None): 235 def changeMetaDataFolder(self,title,metaDataServerUrl,RESPONSE=None):
358 """Change MetaDataFolder""" 236 """Change MetaDataFolder"""