Mercurial > hg > MetaDataProvider
annotate MetaData.py @ 24:d036de7fd78d
getDRI added
author | dwinter |
---|---|
date | Fri, 27 Jul 2012 12:46:00 +0200 |
parents | 9a1e75e708e1 |
children | a19575be96e8 |
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 | |
24 | 153 def getDRI(self,path=None,type="escidoc",dom=None): |
154 """returns the DRI of an document, i.e. the content of the dri tag with the given type.""" | |
155 | |
156 #logging.debug("getData(path=%s, dom=%s)"%(path,dom)) | |
157 | |
158 | |
159 if path is None and dom is None: | |
160 return None | |
161 | |
162 | |
163 if dom is None: | |
164 # get from server | |
165 dom = self.getDomFromPathOrUrl(path) | |
166 | |
167 # ElementTree doesn't like absolute paths | |
168 # lets assume dom is rooted in the first element | |
169 | |
170 xpath = '.' + self.getXmlPath(omitRoot=True)+'/dri[@type="%s"]'%type | |
171 logging.debug("getSubDom looking for %s in %s"%(xpath, dom)) | |
172 | |
173 | |
174 elem = dom.find(xpath) | |
175 | |
176 | |
177 if elem is None: | |
178 return None | |
179 | |
180 | |
181 return getText(elem) | |
182 | |
15 | 183 def getData(self, path=None, dom=None, normalizeNames=True, all=False, recursive=0, allText=0): |
16 | 184 """Returns dict with attributes and child elements from corresponding tag. |
185 | |
186 @param path: file or url path to metadata file | |
187 @param dom: dom of metadata | |
188 @param normalizeNames: normalize tag names | |
189 @param all: put contents of tags with the same name in list value | |
190 @param recurse: number of recursions. 0=just children | |
191 @param allText: get text content of all subelements | |
192 @returns: dict with attributes (key=@attr) and child elements (key=tag) | |
193 """ | |
194 #logging.debug("getData(path=%s, dom=%s)"%(path,dom)) | |
13 | 195 if path is None and dom is None: |
196 return None | |
197 | |
15 | 198 elem = self.getSubDom(path=path, dom=dom, all=all) |
17 | 199 if elem is None: |
200 return None | |
201 | |
15 | 202 if all: |
203 # subdom is list - return list | |
204 data = [] | |
205 for e in elem: | |
16 | 206 data.append(self._getData(e, recursive=recursive, normalizeNames=normalizeNames, all=all, allText=allText)) |
14 | 207 |
208 else: | |
15 | 209 # subdom is element |
16 | 210 data = self._getData(elem, recursive=recursive, normalizeNames=normalizeNames, all=all, allText=allText) |
15 | 211 |
16 | 212 if self.mappingSelectAttribute: |
213 # put type in @type | |
214 attr = data.get('@attr', None) | |
215 if attr: | |
216 type = attr.get(self.mappingSelectAttribute, None) | |
217 if type is not None: | |
218 data['@type'] = normalizeFieldName(type) | |
219 | |
15 | 220 return data |
221 | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
222 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
223 def getMapping(self, type): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
224 """returns MetaDataMapping for type""" |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
225 # try type as id |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
226 mapping = getattr(self, type, None) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
227 if mapping is None: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
228 # try manually |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
229 mapFolder = self |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
230 for obj in mapFolder.objectValues(): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
231 if obj.meta_type == "MetadataMapping": |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
232 # real type is in title |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
233 mapType = obj.title |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
234 if mapType == type: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
235 # try type as is |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
236 return obj |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
237 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
238 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
|
239 # try normalized type without underscore |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
240 return obj |
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 return mapping |
0 | 243 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
244 def getMapFields(self, data): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
245 """returns dict with metadata description for data""" |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
246 fields = {} |
11 | 247 type = data.get('@type', None) |
248 if not type: | |
249 logging.error("getMapFields: no @type!") | |
250 return fields | |
251 | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
252 # get mapping from main/meta/bib |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
253 mapping = self.getMapping(type) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
254 if mapping is None: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
255 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
|
256 return fields |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
257 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
258 # 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
|
259 fields = mapping.getFields().copy() |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
260 # add field list |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
261 fields['@fieldList'] = mapping.getFieldList() |
0 | 262 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
263 return fields |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
264 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
265 def getMappedData(self, data, allFields=False): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
266 """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
|
267 fields = self.getMapFields(data) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
268 fieldList = fields['@fieldList'] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
269 mappedData = {} |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
270 mappedList = [] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
271 for bk in fieldList: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
272 # ignore descriptions without data |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
273 if not data.get(bk, None): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
274 continue |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
275 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
276 # field description (copy so we can change it) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
277 bf = fields[bk].copy() |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
278 # add value |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
279 bf['value'] = data[bk] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
280 mappedData[bk] = bf |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
281 mappedList.append(bk) |
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 if allFields and len(mappedData) < len(data): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
284 # add fields that were not in fields |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
285 for bk in data.keys(): |
20 | 286 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
|
287 continue |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
288 |
20 | 289 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
290 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
|
291 mappedList.append(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 mappedData['@fieldList'] = mappedList |
20 | 294 mappedData['@type'] = data.get('@type',None) |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
295 return mappedData |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
296 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
297 def getDCMappedData(self, data, allFields=False): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
298 """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
|
299 fields = self.getMapFields(data) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
300 dcData = {} |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
301 for bk in fields.keys(): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
302 # ignore descriptions without data |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
303 if not data.get(bk, None): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
304 continue |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
305 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
306 # field description |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
307 dc = fields[bk].get('dcmap', None) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
308 if dc: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
309 # add value |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
310 if dcData.get('dc',None): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
311 # key exists - append |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
312 dcData[dc] += '/' + data[bk] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
313 else: |
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 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
316 return dcData |
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 def getFormatted(self, template, path=None, dom=None, data=None, allFields=False): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
319 """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
|
320 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
|
321 logging.debug("getFormatted(template=%s)"%(template)) |
24 | 322 logging.debug(self.absolute_url()) |
323 logging.debug(self.__dict__) | |
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 |
24 | 336 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
337 tp=getattr(self,"%s_%s"%(template, normalizeFieldName(type)), None) |
24 | 338 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
339 if tp is None: |
24 | 340 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
|
341 # try generic |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
342 tp=getattr(self,"%s_generic"%(template), None) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
343 if tp is None: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
344 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
|
345 return "" |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
346 |
14 | 347 if type: |
348 # put field descriptions in mdHash | |
349 fields = self.getMappedData(data, allFields=allFields) | |
350 else: | |
351 fields = {} | |
24 | 352 |
353 logging.debug("XXXX") | |
354 logging.debug(tp) | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
355 return tp(mdmap=fields, md=data) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
356 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
357 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
358 |
0 | 359 def correctPath(self,path,remove=None,prefix=None,cut=0): |
360 """convinience method um einen pfad zu veraendern""" | |
361 if remove is not None: | |
362 path=path.replace(remove,'') | |
363 if prefix is not None: | |
364 path=os.path.join(prefix,path) | |
365 | |
366 if cut>0: | |
367 splitted=path.split("/") | |
368 path="/".join(splitted[0:len(splitted)-cut]) | |
369 return path | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
370 |
0 | 371 |
372 def importMetaDataExportXML(self,importFile=None,RESPONSE=None): | |
373 """imports metadata from the metadataexportxml file""" | |
374 | |
375 if importFile is None: | |
3 | 376 pt=PageTemplateFile('zpt/importMetaDataExportXML', globals()).__of__(self) |
0 | 377 return pt() |
378 | |
3 | 379 dom=ET.parse(importFile) |
380 node = dom.getroot() | |
381 if node.tag != 'metadataExport': | |
382 node = dom.find("metadataExport") | |
383 | |
384 self.createMappingFromDom(node) | |
0 | 385 |
386 if RESPONSE is not None: | |
387 RESPONSE.redirect('manage_main') | |
388 | |
389 | |
390 def createMappingFromDom(self,metadatanode,metadata=None): | |
391 """erzeuge ein Mapping aus dem der metadatanode des xmlformats, metadata ist ein metadataobject""" | |
392 | |
393 if metadata is None: | |
394 metadata=self | |
395 | |
3 | 396 nodes=metadatanode |
0 | 397 |
398 for node in nodes: | |
2 | 399 logging.debug("node: %s"%repr(node)) |
3 | 400 if node.tag=="set": |
0 | 401 set=node |
3 | 402 id=set.get('name') |
403 list=[] | |
404 argList={} | |
405 for entry in set: | |
406 genericName=entry.get('genericName') | |
407 if set.get('name')=='generic': | |
408 # generic mapping doesn't have labels | |
409 tag = genericName | |
410 label = genericName | |
411 else: | |
412 tag=entry.get('tag') | |
413 label=entry.get('label') | |
414 | |
415 if not tag: | |
416 # ignore empty tags | |
417 continue | |
418 | |
419 description=getText(entry) | |
420 argList[tag]={'tag':tag,'label':label,'explanation':description,'status':'optional'} | |
421 | |
422 logging.debug("createMappingFromDom: new mapping=%s"%repr(argList)) | |
423 metadata._setObject(id,MetaDataMapping(id,id,argList)) | |
424 | |
425 elif node.tag=="metadata": | |
0 | 426 mn=node |
3 | 427 name=mn.get('name') |
428 logging.debug("createMappingFromDom: new metadata=%s"%repr(name)) | |
0 | 429 metadata._setObject(name,MetaData(name,name)) |
430 mdObj=getattr(metadata,name) | |
431 mdObj.createMappingFromDom(mn) | |
432 | |
433 | |
5 | 434 security.declarePublic('changeMetaDataForm') |
9 | 435 changeMetaDataForm = PageTemplateFile('zpt/changeMetadata', globals()) |
0 | 436 |
5 | 437 security.declarePublic('changeMetaData') |
11 | 438 def changeMetaData(self,title=None,shortDescription=None,description=None,mappingSelectAttribute=None,fields=None,metaDataServerUrl=None,RESPONSE=None): |
0 | 439 """Change Metadata""" |
11 | 440 self.title = title |
0 | 441 self.shortDescription=shortDescription |
442 self.description=description | |
11 | 443 self.mappingSelectAttribute=mappingSelectAttribute |
444 if fields: | |
445 self.fieldList=fields.split(",")[0:] | |
446 | |
0 | 447 self.metaDataServerUrl=metaDataServerUrl |
11 | 448 |
0 | 449 if RESPONSE is not None: |
450 RESPONSE.redirect('manage_main') | |
451 | |
452 | |
453 def manage_addMetaDataForm(self): | |
9 | 454 """interface for adding the Metadata""" |
455 pt=PageTemplateFile('zpt/addMetadataForm', globals()).__of__(self) | |
0 | 456 return pt() |
457 | |
13 | 458 def manage_addMetaData(self,id,title=None,shortDescription=None,description=None,fields=None,RESPONSE=None): |
0 | 459 """a metadata objekt""" |
13 | 460 newObj = MetaData(id,title=title,shortDescription=shortDescription,description=description,fields=fields) |
0 | 461 self.Destination()._setObject(id,newObj) |
462 if RESPONSE is not None: | |
463 RESPONSE.redirect('manage_main') | |
464 |