Mercurial > hg > MetaDataProvider
annotate MetaData.py @ 26:a19575be96e8
getDRI reshuffled, works on python 2.6. now.
author | casties |
---|---|
date | Mon, 30 Jul 2012 19:43:23 +0200 |
parents | d036de7fd78d |
children | a0d273542509 |
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 | |
184 attr = data.get('@attr', None) | |
185 if attr: | |
186 type = attr.get(self.mappingSelectAttribute, None) | |
187 if type is not None: | |
188 data['@type'] = normalizeFieldName(type) | |
189 | |
15 | 190 return data |
191 | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
192 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
193 def getMapping(self, type): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
194 """returns MetaDataMapping for type""" |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
195 # try type as id |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
196 mapping = getattr(self, type, None) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
197 if mapping is None: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
198 # try manually |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
199 mapFolder = self |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
200 for obj in mapFolder.objectValues(): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
201 if obj.meta_type == "MetadataMapping": |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
202 # real type is in title |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
203 mapType = obj.title |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
204 if mapType == type: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
205 # try type as is |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
206 return obj |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
207 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
208 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
|
209 # try normalized type without underscore |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
210 return obj |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
211 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
212 return mapping |
0 | 213 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
214 def getMapFields(self, data): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
215 """returns dict with metadata description for data""" |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
216 fields = {} |
11 | 217 type = data.get('@type', None) |
218 if not type: | |
219 logging.error("getMapFields: no @type!") | |
220 return fields | |
221 | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
222 # get mapping from main/meta/bib |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
223 mapping = self.getMapping(type) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
224 if mapping is None: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
225 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
|
226 return fields |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
227 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
228 # 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
|
229 fields = mapping.getFields().copy() |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
230 # add field list |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
231 fields['@fieldList'] = mapping.getFieldList() |
0 | 232 |
6
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 def getMappedData(self, data, allFields=False): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
236 """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
|
237 fields = self.getMapFields(data) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
238 fieldList = fields['@fieldList'] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
239 mappedData = {} |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
240 mappedList = [] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
241 for bk in fieldList: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
242 # ignore descriptions without data |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
243 if not data.get(bk, None): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
244 continue |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
245 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
246 # field description (copy so we can change it) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
247 bf = fields[bk].copy() |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
248 # add value |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
249 bf['value'] = data[bk] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
250 mappedData[bk] = bf |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
251 mappedList.append(bk) |
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 if allFields and len(mappedData) < len(data): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
254 # add fields that were not in fields |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
255 for bk in data.keys(): |
20 | 256 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
|
257 continue |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
258 |
20 | 259 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
260 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
|
261 mappedList.append(bk) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
262 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
263 mappedData['@fieldList'] = mappedList |
20 | 264 mappedData['@type'] = data.get('@type',None) |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
265 return mappedData |
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 getDCMappedData(self, data, allFields=False): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
268 """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
|
269 fields = self.getMapFields(data) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
270 dcData = {} |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
271 for bk in fields.keys(): |
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 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
277 dc = fields[bk].get('dcmap', None) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
278 if dc: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
279 # add value |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
280 if dcData.get('dc',None): |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
281 # key exists - append |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
282 dcData[dc] += '/' + data[bk] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
283 else: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
284 dcData[dc] = data[bk] |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
285 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
286 return dcData |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
287 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
288 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
|
289 """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
|
290 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
|
291 logging.debug("getFormatted(template=%s)"%(template)) |
24 | 292 logging.debug(self.absolute_url()) |
293 logging.debug(self.__dict__) | |
294 | |
13 | 295 # get contents of tag |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
296 if data is None: |
9 | 297 data = self.getData(path=path, dom=dom) |
13 | 298 if data is None: |
299 # no data | |
300 logging.error("getFormatted: no data for template: %s"%(template)) | |
301 return "" | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
302 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
303 type = data.get('@type', '') |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
304 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
305 # get template |
24 | 306 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
307 tp=getattr(self,"%s_%s"%(template, normalizeFieldName(type)), None) |
24 | 308 |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
309 if tp is None: |
24 | 310 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
|
311 # try generic |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
312 tp=getattr(self,"%s_generic"%(template), None) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
313 if tp is None: |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
314 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
|
315 return "" |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
316 |
14 | 317 if type: |
318 # put field descriptions in mdHash | |
319 fields = self.getMappedData(data, allFields=allFields) | |
320 else: | |
321 fields = {} | |
24 | 322 |
323 logging.debug("XXXX") | |
324 logging.debug(tp) | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
325 return tp(mdmap=fields, md=data) |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
326 |
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
327 |
0 | 328 def correctPath(self,path,remove=None,prefix=None,cut=0): |
329 """convinience method um einen pfad zu veraendern""" | |
330 if remove is not None: | |
331 path=path.replace(remove,'') | |
332 if prefix is not None: | |
333 path=os.path.join(prefix,path) | |
334 | |
335 if cut>0: | |
336 splitted=path.split("/") | |
337 path="/".join(splitted[0:len(splitted)-cut]) | |
338 return path | |
6
00147a1ab4ac
division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents:
5
diff
changeset
|
339 |
0 | 340 |
341 def importMetaDataExportXML(self,importFile=None,RESPONSE=None): | |
342 """imports metadata from the metadataexportxml file""" | |
343 | |
344 if importFile is None: | |
3 | 345 pt=PageTemplateFile('zpt/importMetaDataExportXML', globals()).__of__(self) |
0 | 346 return pt() |
347 | |
3 | 348 dom=ET.parse(importFile) |
349 node = dom.getroot() | |
350 if node.tag != 'metadataExport': | |
351 node = dom.find("metadataExport") | |
352 | |
353 self.createMappingFromDom(node) | |
0 | 354 |
355 if RESPONSE is not None: | |
356 RESPONSE.redirect('manage_main') | |
357 | |
358 | |
359 def createMappingFromDom(self,metadatanode,metadata=None): | |
360 """erzeuge ein Mapping aus dem der metadatanode des xmlformats, metadata ist ein metadataobject""" | |
361 | |
362 if metadata is None: | |
363 metadata=self | |
364 | |
3 | 365 nodes=metadatanode |
0 | 366 |
367 for node in nodes: | |
2 | 368 logging.debug("node: %s"%repr(node)) |
3 | 369 if node.tag=="set": |
0 | 370 set=node |
3 | 371 id=set.get('name') |
372 list=[] | |
373 argList={} | |
374 for entry in set: | |
375 genericName=entry.get('genericName') | |
376 if set.get('name')=='generic': | |
377 # generic mapping doesn't have labels | |
378 tag = genericName | |
379 label = genericName | |
380 else: | |
381 tag=entry.get('tag') | |
382 label=entry.get('label') | |
383 | |
384 if not tag: | |
385 # ignore empty tags | |
386 continue | |
387 | |
388 description=getText(entry) | |
389 argList[tag]={'tag':tag,'label':label,'explanation':description,'status':'optional'} | |
390 | |
391 logging.debug("createMappingFromDom: new mapping=%s"%repr(argList)) | |
392 metadata._setObject(id,MetaDataMapping(id,id,argList)) | |
393 | |
394 elif node.tag=="metadata": | |
0 | 395 mn=node |
3 | 396 name=mn.get('name') |
397 logging.debug("createMappingFromDom: new metadata=%s"%repr(name)) | |
0 | 398 metadata._setObject(name,MetaData(name,name)) |
399 mdObj=getattr(metadata,name) | |
400 mdObj.createMappingFromDom(mn) | |
401 | |
402 | |
5 | 403 security.declarePublic('changeMetaDataForm') |
9 | 404 changeMetaDataForm = PageTemplateFile('zpt/changeMetadata', globals()) |
0 | 405 |
5 | 406 security.declarePublic('changeMetaData') |
11 | 407 def changeMetaData(self,title=None,shortDescription=None,description=None,mappingSelectAttribute=None,fields=None,metaDataServerUrl=None,RESPONSE=None): |
0 | 408 """Change Metadata""" |
11 | 409 self.title = title |
0 | 410 self.shortDescription=shortDescription |
411 self.description=description | |
11 | 412 self.mappingSelectAttribute=mappingSelectAttribute |
413 if fields: | |
414 self.fieldList=fields.split(",")[0:] | |
415 | |
0 | 416 self.metaDataServerUrl=metaDataServerUrl |
11 | 417 |
0 | 418 if RESPONSE is not None: |
419 RESPONSE.redirect('manage_main') | |
420 | |
421 | |
422 def manage_addMetaDataForm(self): | |
9 | 423 """interface for adding the Metadata""" |
424 pt=PageTemplateFile('zpt/addMetadataForm', globals()).__of__(self) | |
0 | 425 return pt() |
426 | |
13 | 427 def manage_addMetaData(self,id,title=None,shortDescription=None,description=None,fields=None,RESPONSE=None): |
0 | 428 """a metadata objekt""" |
13 | 429 newObj = MetaData(id,title=title,shortDescription=shortDescription,description=description,fields=fields) |
0 | 430 self.Destination()._setObject(id,newObj) |
431 if RESPONSE is not None: | |
432 RESPONSE.redirect('manage_main') | |
433 |