Mercurial > hg > MetaDataProvider
annotate MetaData.py @ 30:1cb439acd1e1
cross scripting
| author | dwinter |
|---|---|
| date | Tue, 25 Sep 2012 15:57:35 +0200 |
| parents | b3428e281ee2 |
| children | ab58edfc0707 |
| rev | line source |
|---|---|
| 0 | 1 from OFS.Folder import Folder |
| 2 from Products.PageTemplates.PageTemplateFile import PageTemplateFile | |
| 3 from Globals import package_home | |
| 4 from AccessControl import ClassSecurityInfo | |
| 5 import logging | |
| 6 | |
| 7 import xml.etree.ElementTree as ET | |
| 29 | 8 import xml.sax.saxutils |
| 0 | 9 |
| 2 | 10 from MetaDataMapping import MetaDataMapping |
| 0 | 11 from SrvTxtUtils import getHttpData, getText |
| 12 | |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
13 def normalizeFieldName(bt, underscore=True): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
14 """returns normalised field type for looking up mappings""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
15 bt = bt.strip().replace(' ', '-').lower() |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
16 if underscore: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
17 bt = bt.replace('_', '-') |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
18 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
19 return bt |
| 0 | 20 |
| 15 | 21 def putAppend(hash, key, value): |
| 22 """puts value in dict hash at key if it doesn't exist or adds value to a list""" | |
| 16 | 23 #logging.debug("putAppend(hash=%s, key=%s, value=%s)"%(hash,key,value)) |
| 15 | 24 if key in hash: |
| 25 # key exists | |
| 26 oldval = hash[key] | |
| 27 if isinstance(oldval, list): | |
| 28 # is list already - append | |
| 29 oldval.append(value) | |
| 30 else: | |
| 31 # needs list | |
| 32 val = [oldval, value] | |
| 33 hash[key] = val | |
| 34 | |
| 35 else: | |
| 36 # key doesn't exist | |
| 37 hash[key] = value | |
| 38 | |
| 16 | 39 #logging.debug("putAppend returns hash=%s"%(hash)) |
| 15 | 40 return hash |
| 0 | 41 |
| 16 | 42 |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
43 class MetaData(Folder): |
| 0 | 44 """provides basic methods for managing metadata structures""" |
| 45 meta_type='MetaData' | |
| 46 security=ClassSecurityInfo() | |
| 47 manage_options = Folder.manage_options+( | |
| 5 | 48 {'label':'Main Config','action':'changeMetaDataForm'}, |
| 0 | 49 {'label':'Import XML Schema','action':'importMetaDataExportXML'}, |
| 3 | 50 #{'label':'Select Fields for Display','action':'indicateDisplayFieldsForm'}, |
| 0 | 51 ) |
| 52 | |
| 11 | 53 mappingSelectAttribute = None |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
54 """the name of the attribute that can be used to select a mapping (if applicable)""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
55 |
| 11 | 56 def __init__(self,id,title=None,shortDescription='',description='',fields=''): |
| 0 | 57 """initialize a new instance""" |
| 58 self.id = id | |
| 11 | 59 # title is tag name |
| 60 if title: | |
| 61 self.title = title | |
| 62 else: | |
| 63 # assume id is tag name | |
| 64 self.title = id | |
| 65 | |
| 0 | 66 self.shortDescription =shortDescription #label fuer link auf add page |
| 67 self.description=description #description of the method for link page | |
| 13 | 68 if fields: |
| 69 self.fieldList=fields.split(",")[0:] | |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
70 #self.metaDataServerUrl="" # muss mit change metadata gesetzt werden |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
71 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
72 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
73 def getFieldList(self): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
74 """returns fieldList""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
75 return ','.join(self.fieldList) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
76 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
77 def getTagName(self): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
78 """returns the tag name of this element""" |
| 11 | 79 if self.title: |
| 80 return self.title | |
| 81 else: | |
| 82 return self.shortDescription | |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
83 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
84 def getXmlPath(self, omitRoot=False): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
85 """returns the xpath to this element""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
86 path = '/%s'%self.getTagName() |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
87 parent = self.aq_parent |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
88 if parent.meta_type == self.meta_type: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
89 # add parent |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
90 path = parent.getXmlPath(omitRoot=omitRoot) + path |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
91 elif omitRoot: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
92 return '' |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
93 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
94 return path |
| 7 | 95 |
| 15 | 96 def getSubDom(self, path=None, dom=None, all=False): |
| 14 | 97 """returns the subtree (list) of the dom rooted in this element""" |
| 8 | 98 if dom is None: |
| 99 # get from server | |
| 20 | 100 dom = self.getDomFromPathOrUrl(path) |
| 8 | 101 |
| 102 # ElementTree doesn't like absolute paths | |
| 103 # lets assume dom is rooted in the first element | |
| 104 xpath = '.' + self.getXmlPath(omitRoot=True) | |
| 105 logging.debug("getSubDom looking for %s in %s"%(xpath, dom)) | |
| 15 | 106 if all: |
| 107 elem = dom.findall(xpath) | |
| 108 else: | |
| 109 elem = dom.find(xpath) | |
| 110 | |
| 8 | 111 return elem |
| 7 | 112 |
| 15 | 113 |
| 114 def _getData(self, elem, recursive, normalizeNames=False, all=False, allText=False): | |
| 16 | 115 """helper method for getData()""" |
| 116 #logging.debug("_getDataFromDom(dom=%s, recursive=%s)"%(elem,recursive)) | |
| 15 | 117 data = {} |
| 118 attr = {} | |
| 119 # put attributes in @attr | |
| 120 for attname in elem.keys(): | |
| 121 attr[attname] = elem.get(attname) | |
| 122 | |
| 123 if attr: | |
| 124 data['@attr'] = attr | |
| 125 | |
| 17 | 126 # put text in @text |
| 127 if elem.text: | |
| 128 data['@text'] = elem.text | |
| 129 | |
| 15 | 130 for e in elem: |
| 131 # put all child elements in data | |
| 132 if normalizeNames: | |
| 133 # normalize key names | |
| 134 key = normalizeFieldName(e.tag) | |
| 135 else: | |
| 136 key = e.tag | |
| 137 | |
| 138 if recursive > 0: | |
| 17 | 139 # more recursive - call _getData on element |
| 15 | 140 val = self._getData(e, recursive=recursive-1, normalizeNames=normalizeNames, all=all, allText=allText) |
| 141 else: | |
| 142 val = getText(e, recursive=allText) | |
| 143 | |
| 144 if all: | |
| 145 # add multiple tags as list | |
| 146 putAppend(data, key, val) | |
| 147 else: | |
| 148 data[key] = val | |
| 149 | |
| 16 | 150 #logging.debug("_getDataFromDom: returns %s"%repr(data)) |
| 15 | 151 return data |
| 152 | |
| 153 | |
| 154 def getData(self, path=None, dom=None, normalizeNames=True, all=False, recursive=0, allText=0): | |
| 16 | 155 """Returns dict with attributes and child elements from corresponding tag. |
| 156 | |
| 157 @param path: file or url path to metadata file | |
| 158 @param dom: dom of metadata | |
| 159 @param normalizeNames: normalize tag names | |
| 160 @param all: put contents of tags with the same name in list value | |
| 161 @param recurse: number of recursions. 0=just children | |
| 162 @param allText: get text content of all subelements | |
| 163 @returns: dict with attributes (key=@attr) and child elements (key=tag) | |
| 164 """ | |
| 165 #logging.debug("getData(path=%s, dom=%s)"%(path,dom)) | |
| 13 | 166 if path is None and dom is None: |
| 167 return None | |
| 168 | |
| 15 | 169 elem = self.getSubDom(path=path, dom=dom, all=all) |
| 17 | 170 if elem is None: |
| 171 return None | |
| 172 | |
| 15 | 173 if all: |
| 174 # subdom is list - return list | |
| 175 data = [] | |
| 176 for e in elem: | |
| 16 | 177 data.append(self._getData(e, recursive=recursive, normalizeNames=normalizeNames, all=all, allText=allText)) |
| 14 | 178 |
| 179 else: | |
| 15 | 180 # subdom is element |
| 16 | 181 data = self._getData(elem, recursive=recursive, normalizeNames=normalizeNames, all=all, allText=allText) |
| 15 | 182 |
| 16 | 183 if self.mappingSelectAttribute: |
| 184 # put type in @type | |
|
28
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
185 if all: |
|
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
186 attr = data[0].get('@attr', None) |
|
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
187 else: |
|
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
188 attr = data.get('@attr', None) |
|
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
189 |
| 16 | 190 if attr: |
| 191 type = attr.get(self.mappingSelectAttribute, None) | |
| 192 if type is not None: | |
|
28
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
193 if all: |
|
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
194 data[0]['@type'] = normalizeFieldName(type) |
|
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
195 else: |
|
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
196 data['@type'] = normalizeFieldName(type) |
| 16 | 197 |
| 15 | 198 return data |
| 199 | |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
200 |
| 29 | 201 def getDCDataFromPath(self,path): |
| 202 """returns DC mapped data from path to index.meta""" | |
| 203 data=self.getData(path=path) | |
| 204 ret="""<bib xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"> """ | |
| 205 for key,value in self.getDCMappedData(data).items(): | |
| 206 ret+="""<dc:%s>%s</dc:%s>"""%(key,xml.sax.saxutils.escape(value),key) | |
| 207 ret+="</bib>" | |
| 30 | 208 |
| 209 | |
| 210 REQUEST=self.REQUEST | |
| 211 | |
| 212 if REQUEST is not None: | |
| 213 origin = REQUEST.getHeader('Origin') | |
| 214 if origin: | |
| 215 REQUEST.response.setHeader('Access-Control-Allow-Origin', origin) | |
| 216 REQUEST.response.setHeader('Access-Control-Allow-Credentials', 'true') | |
| 217 else: | |
| 218 REQUEST.response.setHeader('Access-Control-Allow-Origin', '*') | |
| 219 | |
| 220 REQUEST.response.setHeader('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS, HEAD') | |
| 221 REQUEST.response.setHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, Cache-Control, X-Requested-With') | |
| 29 | 222 |
| 223 return ret | |
| 224 | |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
225 def getMapping(self, type): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
226 """returns MetaDataMapping for type""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
227 # try type as id |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
228 mapping = getattr(self, type, None) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
229 if mapping is None: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
230 # try manually |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
231 mapFolder = self |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
232 for obj in mapFolder.objectValues(): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
233 if obj.meta_type == "MetadataMapping": |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
234 # real type is in title |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
235 mapType = obj.title |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
236 if mapType == type: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
237 # try type as is |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
238 return obj |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
239 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
240 if normalizeFieldName(mapType, underscore=True) == normalizeFieldName(type, underscore=True): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
241 # try normalized type without underscore |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
242 return obj |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
243 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
244 return mapping |
| 0 | 245 |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
246 def getMapFields(self, data): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
247 """returns dict with metadata description for data""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
248 fields = {} |
| 11 | 249 type = data.get('@type', None) |
| 250 if not type: | |
| 251 logging.error("getMapFields: no @type!") | |
| 252 return fields | |
| 253 | |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
254 # get mapping from main/meta/bib |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
255 mapping = self.getMapping(type) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
256 if mapping is None: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
257 logging.error("getMapFields: no mapping for type: %s"%type) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
258 return fields |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
259 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
260 # get field descriptions (copy so we can change it) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
261 fields = mapping.getFields().copy() |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
262 # add field list |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
263 fields['@fieldList'] = mapping.getFieldList() |
| 0 | 264 |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
265 return fields |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
266 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
267 def getMappedData(self, data, allFields=False): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
268 """returns dict with metadata descriptions and data for data""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
269 fields = self.getMapFields(data) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
270 fieldList = fields['@fieldList'] |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
271 mappedData = {} |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
272 mappedList = [] |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
273 for bk in fieldList: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
274 # ignore descriptions without data |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
275 if not data.get(bk, None): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
276 continue |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
277 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
278 # field description (copy so we can change it) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
279 bf = fields[bk].copy() |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
280 # add value |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
281 bf['value'] = data[bk] |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
282 mappedData[bk] = bf |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
283 mappedList.append(bk) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
284 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
285 if allFields and len(mappedData) < len(data): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
286 # add fields that were not in fields |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
287 for bk in data.keys(): |
| 20 | 288 if bk in mappedData or not data[bk] or bk[0]=='@': |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
289 continue |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
290 |
| 20 | 291 |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
292 mappedData[bk] = {'tag':bk, 'label':bk, 'value':data[bk]} |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
293 mappedList.append(bk) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
294 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
295 mappedData['@fieldList'] = mappedList |
| 20 | 296 mappedData['@type'] = data.get('@type',None) |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
297 return mappedData |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
298 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
299 def getDCMappedData(self, data, allFields=False): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
300 """returns dict with DC keys and data form data""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
301 fields = self.getMapFields(data) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
302 dcData = {} |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
303 for bk in fields.keys(): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
304 # ignore descriptions without data |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
305 if not data.get(bk, None): |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
306 continue |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
307 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
308 # field description |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
309 dc = fields[bk].get('dcmap', None) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
310 if dc: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
311 # add value |
|
28
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
312 if dcData.get('dc', None): |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
313 # key exists - append |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
314 dcData[dc] += '/' + data[bk] |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
315 else: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
316 dcData[dc] = data[bk] |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
317 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
318 return dcData |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
319 |
|
28
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
320 def getFormatted(self, template, path=None, dom=None, data=None, xdata=None, allFields=False): |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
321 """returns string with document data formatted according to template. |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
322 gets data from server or dom or pre-parsed data.""" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
323 logging.debug("getFormatted(template=%s)"%(template)) |
| 24 | 324 |
| 13 | 325 # get contents of tag |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
326 if data is None: |
| 9 | 327 data = self.getData(path=path, dom=dom) |
| 13 | 328 if data is None: |
| 329 # no data | |
| 330 logging.error("getFormatted: no data for template: %s"%(template)) | |
| 331 return "" | |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
332 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
333 type = data.get('@type', '') |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
334 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
335 # get template |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
336 tp=getattr(self,"%s_%s"%(template, normalizeFieldName(type)), None) |
| 24 | 337 |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
338 if tp is None: |
| 24 | 339 logging.warning("getFormatted: no template for: %s_%s!"%(template, normalizeFieldName(type))) |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
340 # try generic |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
341 tp=getattr(self,"%s_generic"%(template), None) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
342 if tp is None: |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
343 logging.error("getFormatted: no generic template either: %s"%(template)) |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
344 return "" |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
345 |
| 14 | 346 if type: |
| 347 # put field descriptions in mdHash | |
| 348 fields = self.getMappedData(data, allFields=allFields) | |
| 349 else: | |
| 350 fields = {} | |
| 24 | 351 |
| 27 | 352 #logging.debug(tp) |
|
28
40508e672841
richer metadata for bib. still not sufficient though.
casties
parents:
27
diff
changeset
|
353 return tp(mdmap=fields, md=data, mdx=xdata) |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
354 |
|
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
355 |
| 0 | 356 def correctPath(self,path,remove=None,prefix=None,cut=0): |
| 357 """convinience method um einen pfad zu veraendern""" | |
| 358 if remove is not None: | |
| 359 path=path.replace(remove,'') | |
| 360 if prefix is not None: | |
| 361 path=os.path.join(prefix,path) | |
| 362 | |
| 363 if cut>0: | |
| 364 splitted=path.split("/") | |
| 365 path="/".join(splitted[0:len(splitted)-cut]) | |
| 366 return path | |
|
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
367 |
| 0 | 368 |
| 369 def importMetaDataExportXML(self,importFile=None,RESPONSE=None): | |
| 370 """imports metadata from the metadataexportxml file""" | |
| 371 | |
| 372 if importFile is None: | |
| 3 | 373 pt=PageTemplateFile('zpt/importMetaDataExportXML', globals()).__of__(self) |
| 0 | 374 return pt() |
| 375 | |
| 3 | 376 dom=ET.parse(importFile) |
| 377 node = dom.getroot() | |
| 378 if node.tag != 'metadataExport': | |
| 379 node = dom.find("metadataExport") | |
| 380 | |
| 381 self.createMappingFromDom(node) | |
| 0 | 382 |
| 383 if RESPONSE is not None: | |
| 384 RESPONSE.redirect('manage_main') | |
| 385 | |
| 386 | |
| 387 def createMappingFromDom(self,metadatanode,metadata=None): | |
| 388 """erzeuge ein Mapping aus dem der metadatanode des xmlformats, metadata ist ein metadataobject""" | |
| 389 | |
| 390 if metadata is None: | |
| 391 metadata=self | |
| 392 | |
| 3 | 393 nodes=metadatanode |
| 0 | 394 |
| 395 for node in nodes: | |
| 2 | 396 logging.debug("node: %s"%repr(node)) |
| 3 | 397 if node.tag=="set": |
| 0 | 398 set=node |
| 3 | 399 id=set.get('name') |
| 400 list=[] | |
| 401 argList={} | |
| 402 for entry in set: | |
| 403 genericName=entry.get('genericName') | |
| 404 if set.get('name')=='generic': | |
| 405 # generic mapping doesn't have labels | |
| 406 tag = genericName | |
| 407 label = genericName | |
| 408 else: | |
| 409 tag=entry.get('tag') | |
| 410 label=entry.get('label') | |
| 411 | |
| 412 if not tag: | |
| 413 # ignore empty tags | |
| 414 continue | |
| 415 | |
| 416 description=getText(entry) | |
| 417 argList[tag]={'tag':tag,'label':label,'explanation':description,'status':'optional'} | |
| 418 | |
| 419 logging.debug("createMappingFromDom: new mapping=%s"%repr(argList)) | |
| 420 metadata._setObject(id,MetaDataMapping(id,id,argList)) | |
| 421 | |
| 422 elif node.tag=="metadata": | |
| 0 | 423 mn=node |
| 3 | 424 name=mn.get('name') |
| 425 logging.debug("createMappingFromDom: new metadata=%s"%repr(name)) | |
| 0 | 426 metadata._setObject(name,MetaData(name,name)) |
| 427 mdObj=getattr(metadata,name) | |
| 428 mdObj.createMappingFromDom(mn) | |
| 429 | |
| 430 | |
| 5 | 431 security.declarePublic('changeMetaDataForm') |
| 9 | 432 changeMetaDataForm = PageTemplateFile('zpt/changeMetadata', globals()) |
| 0 | 433 |
| 5 | 434 security.declarePublic('changeMetaData') |
| 11 | 435 def changeMetaData(self,title=None,shortDescription=None,description=None,mappingSelectAttribute=None,fields=None,metaDataServerUrl=None,RESPONSE=None): |
| 0 | 436 """Change Metadata""" |
| 11 | 437 self.title = title |
| 0 | 438 self.shortDescription=shortDescription |
| 439 self.description=description | |
| 11 | 440 self.mappingSelectAttribute=mappingSelectAttribute |
| 441 if fields: | |
| 442 self.fieldList=fields.split(",")[0:] | |
| 443 | |
| 0 | 444 self.metaDataServerUrl=metaDataServerUrl |
| 11 | 445 |
| 0 | 446 if RESPONSE is not None: |
| 447 RESPONSE.redirect('manage_main') | |
| 448 | |
| 449 | |
| 450 def manage_addMetaDataForm(self): | |
| 9 | 451 """interface for adding the Metadata""" |
| 452 pt=PageTemplateFile('zpt/addMetadataForm', globals()).__of__(self) | |
| 0 | 453 return pt() |
| 454 | |
| 13 | 455 def manage_addMetaData(self,id,title=None,shortDescription=None,description=None,fields=None,RESPONSE=None): |
| 0 | 456 """a metadata objekt""" |
| 13 | 457 newObj = MetaData(id,title=title,shortDescription=shortDescription,description=description,fields=fields) |
| 0 | 458 self.Destination()._setObject(id,newObj) |
| 459 if RESPONSE is not None: | |
| 460 RESPONSE.redirect('manage_main') | |
| 461 |
