############################################################################## # # Copyright (c) 2006-2007 Nexedi SA and Contributors. All Rights Reserved. # # WARNING: This program as such is intended to be used by professional # programmers who take the whole responsability of assessing all potential # consequences resulting from its eventual inadequacies and bugs # End users who are looking for a ready-to-use solution with commercial # garantees and support are strongly adviced to contract a Free Software # Service Company # # This program is Free Software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # ############################################################################## import zipfile, cStringIO, re import xmlrpclib, base64 from Products.CMFCore.utils import getToolByName def extractContent(data): """ extract text content from ODF data directly by unzipping (no need for oood here) """ # XXX probably not used - to really get text content it should # strip xml too cs = cStringIO.StringIO() cs.write(data) try: z = zipfile.ZipFile(cs) except zipfile.BadZipfile: cs.close() return '' s = z.read('content.xml') cs.close() z.close() return s ###### XXX these methods repeat what is in OOoDocument class # maybe redundant, but we need to access them from Script (Python) def convertToOdf(self, name, data): """ convert data into ODF format to be used in ingestion when we don't yet have an ERP5 object to work with (and we for example have to figure out portal_type) """ sp = mkProxy(self) kw = sp.run_convert(name,base64.encodestring(data)) odf = base64.decodestring(kw['data']) return odf def mkProxy(self): pref = getToolByName(self,'portal_preferences') adr = pref.getPreferredDmsOoodocServerAddress() nr = pref.getPreferredDmsOoodocServerPortNumber() if adr is None or nr is None: raise Exception('you should set conversion server coordinates in preferences') sp = xmlrpclib.ServerProxy('http://%s:%d' % (adr,nr), allow_none=True) return sp def generateFile(self, name, data, format): sp = mkProxy(self) kw = sp.run_generate(name, data, None, format) res = base64.decodestring(kw['data']) return res def getAttrFromFilename(self, fname): """ parse file name using regexp specified in preferences """ rx_parse = re.compile(self.portal_preferences.getPreferredDmsFilenameRegexp()) m = rx_parse.match(fname) if m is None: return {} return m.groupdict() def getLastWorkflowDate(self, state_name='simulation_state', state=('released','public')): '''we can make something more generic out of it or JP says "there is an API for it" and we trash this one''' if not hasattr(self, 'workflow_history'): return None for name,wflow in self.workflow_history.items(): if len(wflow) == 0: continue # empty history if wflow[0].get(state_name) is None: continue # not the right one for i in range(len(wflow)): ch = wflow[-1-i] act = ch.get('action', '') if act is not None and act.endswith('action'): if ch.get(state_name, '') in state: return ch['time'] return None ############################################################################# # Mail management def findAddress(txt): """ find email address in a string """ validchars='0-9A-Za-z.\-_' r=re.compile('[%s]+@[%s]+' % (validchars,validchars)) m=r.search(txt) return m and m.group() def extractParams(txt): """ extract parameters given in mail body We assume that parameters are given as lines of the format: name:value """ r=re.compile('^([\w_]+):([\w_/]+)$') res=[] for line in txt.split(): found=r.findall(line.strip()) if len(found)==1: res.append(found[0]) return dict(res)