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