PyXR

c:\projects\bitpim\src \ sms_imexport.py



0001 ### BITPIM
0002 ###
0003 ### Copyright (C) 2004 Joe Pham <djpham@bitpim.org>
0004 ###
0005 ### This program is free software; you can redistribute it and/or modify
0006 ### it under the terms of the BitPim license as detailed in the LICENSE file.
0007 ###
0008 ### $Id: sms_imexport.py 4440 2007-11-02 01:44:07Z djpham $
0009 
0010 "Deals with SMS import/export stuff"
0011 # System Module
0012 from __future__ import with_statement
0013 from email.generator import Generator
0014 from email.mime.text import MIMEText
0015 from email.utils import formatdate
0016 
0017 # wxPython modules
0018 import wx
0019 
0020 # BitPim Modules
0021 import bptime
0022 import guihelper
0023 import sms
0024 
0025 #------------------------------------------------------------------------------
0026 class ExportSMSDialog(wx.Dialog):
0027     def __init__(self, parent, title):
0028         super(ExportSMSDialog, self).__init__(parent, -1, title)
0029         self._smswidget=parent.GetActiveSMSWidget()
0030         self._sel_data=self._smswidget.get_selected_data()
0031         self._data=self._smswidget.get_data()
0032         # make the ui
0033         vbs=wx.BoxSizer(wx.VERTICAL)
0034         hbs=wx.BoxSizer(wx.HORIZONTAL)
0035         hbs.Add(wx.StaticText(self, -1, "File"), 0, wx.ALL|wx.ALIGN_CENTRE, 5)
0036         self.filenamectrl=wx.TextCtrl(self, -1, "sms_export")
0037         hbs.Add(self.filenamectrl, 1, wx.ALL|wx.EXPAND, 5)
0038         self.browsectrl=wx.Button(self, wx.NewId(), "Browse...")
0039         hbs.Add(self.browsectrl, 0, wx.ALL|wx.EXPAND, 5)
0040         vbs.Add(hbs, 0, wx.EXPAND|wx.ALL, 5)
0041         # selection GUI
0042         vbs.Add(self.GetSelectionGui(self), 5, wx.EXPAND|wx.ALL, 5)
0043         # the buttons
0044         vbs.Add(wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL), 0, wx.EXPAND|wx.ALL,5)
0045         vbs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL), 0, wx.ALIGN_CENTER|wx.ALL, 5)
0046         # event handlers
0047         wx.EVT_BUTTON(self, self.browsectrl.GetId(), self.OnBrowse)
0048         wx.EVT_BUTTON(self, wx.ID_OK, self.OnOk)
0049         # all done
0050         self.SetSizer(vbs)
0051         self.SetAutoLayout(True)
0052         vbs.Fit(self)
0053 
0054     _formats=('mbox', 'CSV')
0055     _wildcards={ _formats[0]: 'mbox files (*.mbox)|*.mbox',
0056                  _formats[1]: 'CSV files (*.csv)|*.csv',
0057                  }
0058     def GetSelectionGui(self, parent):
0059         hbs=wx.BoxSizer(wx.HORIZONTAL)
0060         rbs=wx.StaticBoxSizer(wx.StaticBox(self, -1, "SMS Messages"), wx.VERTICAL)
0061         lsel=len(self._sel_data)
0062         lall=len(self._data)
0063         self.rows_selected=wx.RadioButton(self, wx.NewId(), "Selected (%d)" % (lsel,), style=wx.RB_GROUP)
0064         self.rows_all=wx.RadioButton(self, wx.NewId(), "All (%d)" % (lall,))
0065         if lsel==0:
0066             self.rows_selected.Enable(False)
0067             self.rows_selected.SetValue(0)
0068             self.rows_all.SetValue(1)
0069         rbs.Add(self.rows_selected, 0, wx.EXPAND|wx.ALL, 2)
0070         hbs.Add(rbs, 3, wx.EXPAND|wx.ALL, 5)
0071         rbs.Add(self.rows_all, 0, wx.EXPAND|wx.ALL, 2)
0072         vbs=wx.StaticBoxSizer(wx.StaticBox(self, -1, 'Export Format'),
0073                               wx.VERTICAL)
0074         self._format=wx.ComboBox(self, wx.NewId(),
0075                                  value=self._formats[0],
0076                                  choices=self._formats,
0077                                  style=wx.CB_READONLY)
0078         vbs.Add(self._format, 0, wx.EXPAND|wx.ALL, 5)
0079         hbs.Add(vbs, 3, wx.EXPAND|wx.ALL, 5)        
0080         return hbs
0081 
0082     def OnBrowse(self, _):
0083         with guihelper.WXDialogWrapper(wx.FileDialog(self, defaultFile=self.filenamectrl.GetValue(),
0084                                                      wildcard=self._wildcards[self._format.GetValue()],
0085                                                      style=wx.SAVE|wx.CHANGE_DIR),
0086                                        True) as (dlg, retcode):
0087             if retcode==wx.ID_OK:
0088                 self.filenamectrl.SetValue(dlg.GetPath())
0089 
0090     def OnOk(self, _):
0091         # do export
0092         filename=self.filenamectrl.GetValue()
0093         try:
0094             _fp=file(filename, 'wt')
0095         except:
0096             _fp=None
0097         if _fp is None:
0098             guihelper.MessageDialog(self, 'Failed to open file ['+filename+']',
0099                                     'Export Error')
0100             self.EndModal(wx.ID_OK)
0101         if self.rows_all.GetValue():
0102             _sms=self._data
0103         else:
0104             _sms=self._sel_data
0105         if self._format.GetValue()==self._formats[0]:
0106             self._export_mbox(_fp, _sms)
0107         else:
0108             self._export_csv(_fp, _sms)
0109         _fp.close()
0110         self.EndModal(wx.ID_OK)
0111 
0112     def _export_mbox(self, fp, sms):
0113         # export SMS data to mbox format
0114         _email_generator=Generator(fp, True)
0115         _lfs='\n\n'
0116         _keys=sms.keys()
0117         _keys.sort()
0118         for k in _keys:
0119             e=sms[k]
0120             try:
0121                 _msg=MIMEText(e.text)
0122                 _msg['From']=e._from or 'self'
0123                 _msg['To']=e._to or 'self'
0124                 _msg['Subject']=e.subject
0125                 if e.datetime:
0126                     _msg['Date']=formatdate(bptime.BPTime(e.datetime).mktime(), True)
0127                 _email_generator.flatten(_msg, True)
0128                 _email_generator.write(_lfs)
0129             except:
0130                 if __debug__:
0131                     raise
0132 
0133     def _yesno_str(self, v):
0134         if v:
0135             return 'Yes'
0136         return 'No'
0137     def _datetime_str(self, v):
0138         if v:
0139             _dt=bptime.BPTime(v)
0140             return _dt.date_str()+' '+_dt.time_str()
0141         return ''
0142     def _priority_str(self, v):
0143         return sms.SMSEntry._priority_name.get(v, '')
0144 
0145     _csv_template=(
0146         ('Date', 'datetime', _datetime_str),
0147         ('From', '_from', None),
0148         ('To', '_to', None),
0149         ('Subj', 'subject', None),
0150         ('Text', 'text', None),
0151         ('Priority', 'priority', _priority_str),
0152         ('Read', 'read', _yesno_str),
0153         ('Locked', 'locked', _yesno_str),
0154         ('Callback', 'callback', None),
0155         ('Folder', 'folder', None))
0156     def _export_csv(self, fp, sms):
0157         # export SMS data to CSV format
0158         # print out the header
0159         fp.write(','.join(['"'+e[0]+'"' for e in self._csv_template])+'\n')
0160         # and the entries
0161         _keys=sms.keys()
0162         _keys.sort()
0163         for k in _keys:
0164             try:
0165                 e=sms[k]
0166                 _l=[]
0167                 for _c in self._csv_template:
0168                     if _c[2] is None:
0169                         _s=str(getattr(e, _c[1], ''))
0170                     else:
0171                         _s=_c[2](self, getattr(e, _c[1], None))
0172                     _l.append('"'+_s.replace('"', '')+'"')
0173                 fp.write(','.join(_l)+'\n')
0174             except:
0175                 if __debug__:
0176                     raise
0177 

Generated by PyXR 0.9.4