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