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