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