4
|
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 os.path
|
|
6 import logging
|
|
7
|
|
8 from MetaDataMapping import MetaDataMapping
|
|
9 from MetaData import MetaData
|
|
10
|
|
11 def normalizeBibField(bt, underscore=True):
|
|
12 """returns normalised bib type for looking up mappings"""
|
|
13 bt = bt.strip().replace(' ', '-').lower()
|
|
14 if underscore:
|
|
15 bt = bt.replace('_', '-')
|
|
16
|
|
17 return bt
|
|
18
|
|
19 def getBibdataFromDom(dom):
|
|
20 """returns dict with all elements from bib-tag"""
|
|
21 bibinfo = {}
|
|
22 bib = dom.find(".//meta/bib")
|
|
23 if bib is not None:
|
|
24 # put type in @type
|
|
25 type = bib.get('type')
|
|
26 bibinfo['@type'] = normalizeBibField(type)
|
|
27 # put all subelements in dict
|
|
28 for e in bib:
|
|
29 bibinfo[normalizeBibField(e.tag)] = getText(e)
|
|
30
|
|
31 return bibinfo
|
|
32
|
|
33 class MetaDataFolder(Folder):
|
|
34 """provides methods for managing complete metadata structures"""
|
|
35 meta_type='MetaDataFolder'
|
|
36 security=ClassSecurityInfo()
|
|
37 manage_options = Folder.manage_options+(
|
5
|
38 {'label':'Main Config','action':'changeMetaDataFolderForm'},
|
4
|
39 )
|
|
40
|
5
|
41 def __init__(self,id,title='',metaDataServerUrl=''):
|
4
|
42 """initialize a new instance"""
|
|
43 self.id = id
|
|
44 self.title = title
|
5
|
45 self.metaDataServerUrl = metaDataServerUrl
|
4
|
46
|
|
47
|
|
48 def getMDFromPathOrUrl(self,path):
|
|
49 parsedurl = urlparse.urlparse(path)
|
|
50 if parsedurl[0] != "":
|
|
51 # has schema (e.g. http)
|
|
52 url=path
|
|
53 else:
|
|
54 # path only
|
|
55 if path.endswith("index.meta"):
|
|
56 url =self.metaDataServerUrl%path
|
|
57 else:
|
|
58 url=os.path.join(self.metaDataServerUrl%path,'index.meta')
|
|
59
|
|
60 #logging.debug("get Metadata: %s"%url)
|
|
61 md = getHttpData(url)
|
|
62 return md
|
|
63
|
|
64 def getBibMapping(self, bibtype):
|
|
65 """returns MetaDataMapping for bibtype"""
|
|
66 # try type as id
|
|
67 mapping = getattr(self.main.meta.bib, bibtype, None)
|
|
68 if mapping is None:
|
|
69 # try manually
|
|
70 mapFolder = self.main.meta.bib
|
|
71 for obj in mapFolder.objectValues():
|
|
72 if obj.meta_type == "MetadataMapping":
|
|
73 # real type is in title
|
|
74 mapType = obj.title
|
|
75 if mapType == bibtype:
|
|
76 # try type as is
|
|
77 return obj
|
|
78
|
|
79 if normalizeBibField(mapType, underscore=True) == normalizeBibField(bibtype, underscore=True):
|
|
80 # try normalized type without underscore
|
|
81 return obj
|
|
82
|
|
83 return mapping
|
|
84
|
|
85 def getBibFields(self, bibdata):
|
|
86 """returns dict with metadata description for bibdata"""
|
|
87 bibfields = {}
|
|
88 bibtype = bibdata['@type']
|
|
89 # get mapping from main/meta/bib
|
|
90 mapping = self.getBibMapping(bibtype)
|
|
91 if mapping is None:
|
|
92 logging.error("getBibFields: no mapping for type: %s"%bibtype)
|
|
93 return bibfields
|
|
94
|
|
95 # get field descriptions (copy so we can change it)
|
|
96 bibfields = mapping.getFields().copy()
|
|
97 # add field list
|
|
98 bibfields['@fieldList'] = mapping.getFieldList()
|
|
99
|
|
100 return bibfields
|
|
101
|
|
102 def getBibMappedData(self, bibdata, allFields=False):
|
|
103 """returns dict with metadata descriptions and data for bibdata"""
|
|
104 bibfields = self.getBibFields(bibdata)
|
|
105 mappedData = {}
|
|
106 mappedList = []
|
|
107 for bk in bibfields.keys():
|
|
108 # ignore descriptions without data
|
|
109 if not bibdata.get(bk, None):
|
|
110 continue
|
|
111
|
|
112 # field description (copy so we can change it)
|
|
113 bf = bibfields[bk].copy()
|
|
114 # add value
|
|
115 bf['value'] = bibdata[bk]
|
|
116 mappedData[bk] = bf
|
|
117 mappedList.append(bk)
|
|
118
|
|
119 if allFields and len(mappedData) < len(bibdata):
|
|
120 # add fields that were not in bibfields
|
|
121 for bk in bibdata.keys():
|
|
122 if bk in mappedData or not bibdata[bk]:
|
|
123 continue
|
|
124
|
|
125 mappedData[bk] = {'tag':bk, 'label':bk, 'value':bibdata[bk]}
|
|
126 mappedList.append(bk)
|
|
127
|
|
128 mappedData['@fieldList'] = mappedList
|
|
129 return mappedData
|
|
130
|
|
131 def getFormatted(self, template, path=None, dom=None, bibdata=None, allFields=False):
|
|
132 """returns string with document data formatted according to template.
|
|
133 gets data from server or dom or pre-parsed bibdata."""
|
|
134 logging.debug("getFormatted(template=%s)"%(template))
|
|
135
|
|
136 if dom is None and bibdata is None:
|
|
137 # get from server
|
|
138 md = self.getMDFromPathOrUrl(path.replace("/mpiwg/online",""))
|
|
139 #logging.debug("md:"+md)
|
|
140 #dom = amara.parse(md)
|
|
141 dom = ET.fromstring(md)
|
|
142
|
|
143 # get contents of bib tag
|
|
144 if bibdata is None:
|
|
145 bibdata = getBibdataFromDom(dom)
|
|
146
|
|
147 bibtype = bibdata['@type']
|
|
148
|
|
149 # get template
|
|
150 tp=getattr(self,"%s_%s"%(template, bibtype.lower()), None)
|
|
151 if tp is None:
|
|
152 logging.warning("getFormatted: no template for: %s_%s"%(template, bibtype))
|
|
153 # try generic
|
|
154 tp=getattr(self,"%s_generic"%(template), None)
|
|
155 if tp is None:
|
|
156 logging.error("getFormatted: no generic template either: %s"%(template))
|
|
157 return ""
|
|
158
|
|
159 # put bib field descriptions in mdHash
|
|
160 bibfields = self.getBibMappedData(bibdata, allFields=allFields)
|
|
161
|
|
162 return tp(mdmap=bibfields, md=bibdata)
|
|
163
|
|
164
|
|
165 def getFormattedMetaData(self, path=None, dom=None, bibdata=None):
|
|
166 """get the metadafrom server"""
|
|
167 logging.debug("getFormattedMetaData(path=%s)"%path)
|
|
168 return self.getFormatted('metadata_template', path=path, dom=dom, bibdata=bibdata)
|
|
169
|
|
170 def getFormattedMetaDataShort(self, path=None, dom=None, bibdata=None):
|
|
171 """get the metadafrom server"""
|
|
172 logging.debug("getFormattedMetaDataShort(path=%s)"%path)
|
|
173 return self.getFormatted('metadata_template', path=path, dom=dom, bibdata=bibdata)
|
|
174
|
|
175 def getFormattedMetaDataExtended(self,path=None, dom=None, bibdata=None):
|
|
176 """get the metadafrom server"""
|
|
177 logging.debug("getFormattedMetaDataExtended(path=%s)"%path)
|
|
178 return self.getFormatted('metadata_extended_template', path=path, dom=dom, bibdata=bibdata, allFields=True)
|
|
179
|
|
180 def getFormattedLabel(self,path=None, dom=None, bibdata=None):
|
|
181 """get the metadafrom server"""
|
|
182 logging.debug("getFormattedLabel(%s)"%path)
|
|
183 return self.getFormatted('label_template', path=path, dom=dom, bibdata=bibdata)
|
|
184
|
|
185 def getFormattedMetaDataShortFromServer(self,path):
|
|
186 """get the metadafrom server"""
|
|
187 logging.debug("getFormattedMetaDataShortFromServer(path=%s)"%path)
|
|
188 return self.getFormatted('metadata_template', path)
|
|
189
|
|
190 def getFormattedMetaDataExtendedFromServer(self,path):
|
|
191 """get the metadafrom server"""
|
|
192 logging.debug("getFormattedMetaDataExtendedFromServer(path=%s)"%path)
|
|
193 return self.getFormatted('metadata_extended_template', path=path, allFields=True)
|
|
194
|
|
195 def getFormattedLabelFromServer(self,path):
|
|
196 """get the metadafrom server"""
|
|
197 logging.debug("getFormattedLabelFromServer(%s)"%path)
|
|
198 return self.getFormatted('label_template', path)
|
|
199
|
|
200
|
|
201 changeMetaDataFolderForm = PageTemplateFile('zpt/changeMetaDataFolder',globals())
|
|
202
|
|
203 security.declarePublic('changeMetaDataFolder')
|
|
204 def changeMetaDataFolder(self,title,metaDataServerUrl,RESPONSE=None):
|
|
205 """Change MetaDataFolder"""
|
|
206 self.title = title
|
|
207 self.metaDataServerUrl=metaDataServerUrl
|
|
208 if RESPONSE is not None:
|
|
209 RESPONSE.redirect('manage_main')
|
|
210
|
|
211
|
|
212 manage_addMetaDataFolderForm = PageTemplateFile('zpt/addMetaDataFolderForm',globals())
|
|
213
|
|
214 def manage_addMetaDataFolder(self,id,title,RESPONSE=None):
|
|
215 """a MetaDataFolder objekt"""
|
|
216 newObj=MetaDataFolder(id,title)
|
|
217 self.Destination()._setObject(id,newObj)
|
|
218 if RESPONSE is not None:
|
|
219 RESPONSE.redirect('manage_main')
|
|
220 |