Module sms_imexport
[hide private]
[frames] | no frames]

Source Code for Module sms_imexport

  1  ### BITPIM 
  2  ### 
  3  ### Copyright (C) 2004 Joe Pham <djpham@bitpim.org> 
  4  ### 
  5  ### This program is free software; you can redistribute it and/or modify 
  6  ### it under the terms of the BitPim license as detailed in the LICENSE file. 
  7  ### 
  8  ### $Id: sms_imexport.py 4440 2007-11-02 01:44:07Z djpham $ 
  9   
 10  "Deals with SMS import/export stuff" 
 11  # System Module 
 12  from __future__ import with_statement 
 13  from email.generator import Generator 
 14  from email.mime.text import MIMEText 
 15  from email.utils import formatdate 
 16   
 17  # wxPython modules 
 18  import wx 
 19   
 20  # BitPim Modules 
 21  import bptime 
 22  import guihelper 
 23  import sms 
 24   
 25  #------------------------------------------------------------------------------ 
26 -class ExportSMSDialog(wx.Dialog):
27 - def __init__(self, parent, title):
28 super(ExportSMSDialog, self).__init__(parent, -1, title) 29 self._smswidget=parent.GetActiveSMSWidget() 30 self._sel_data=self._smswidget.get_selected_data() 31 self._data=self._smswidget.get_data() 32 # make the ui 33 vbs=wx.BoxSizer(wx.VERTICAL) 34 hbs=wx.BoxSizer(wx.HORIZONTAL) 35 hbs.Add(wx.StaticText(self, -1, "File"), 0, wx.ALL|wx.ALIGN_CENTRE, 5) 36 self.filenamectrl=wx.TextCtrl(self, -1, "sms_export") 37 hbs.Add(self.filenamectrl, 1, wx.ALL|wx.EXPAND, 5) 38 self.browsectrl=wx.Button(self, wx.NewId(), "Browse...") 39 hbs.Add(self.browsectrl, 0, wx.ALL|wx.EXPAND, 5) 40 vbs.Add(hbs, 0, wx.EXPAND|wx.ALL, 5) 41 # selection GUI 42 vbs.Add(self.GetSelectionGui(self), 5, wx.EXPAND|wx.ALL, 5) 43 # the buttons 44 vbs.Add(wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL), 0, wx.EXPAND|wx.ALL,5) 45 vbs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL), 0, wx.ALIGN_CENTER|wx.ALL, 5) 46 # event handlers 47 wx.EVT_BUTTON(self, self.browsectrl.GetId(), self.OnBrowse) 48 wx.EVT_BUTTON(self, wx.ID_OK, self.OnOk) 49 # all done 50 self.SetSizer(vbs) 51 self.SetAutoLayout(True) 52 vbs.Fit(self)
53 54 _formats=('mbox', 'CSV') 55 _wildcards={ _formats[0]: 'mbox files (*.mbox)|*.mbox', 56 _formats[1]: 'CSV files (*.csv)|*.csv', 57 }
58 - def GetSelectionGui(self, parent):
59 hbs=wx.BoxSizer(wx.HORIZONTAL) 60 rbs=wx.StaticBoxSizer(wx.StaticBox(self, -1, "SMS Messages"), wx.VERTICAL) 61 lsel=len(self._sel_data) 62 lall=len(self._data) 63 self.rows_selected=wx.RadioButton(self, wx.NewId(), "Selected (%d)" % (lsel,), style=wx.RB_GROUP) 64 self.rows_all=wx.RadioButton(self, wx.NewId(), "All (%d)" % (lall,)) 65 if lsel==0: 66 self.rows_selected.Enable(False) 67 self.rows_selected.SetValue(0) 68 self.rows_all.SetValue(1) 69 rbs.Add(self.rows_selected, 0, wx.EXPAND|wx.ALL, 2) 70 hbs.Add(rbs, 3, wx.EXPAND|wx.ALL, 5) 71 rbs.Add(self.rows_all, 0, wx.EXPAND|wx.ALL, 2) 72 vbs=wx.StaticBoxSizer(wx.StaticBox(self, -1, 'Export Format'), 73 wx.VERTICAL) 74 self._format=wx.ComboBox(self, wx.NewId(), 75 value=self._formats[0], 76 choices=self._formats, 77 style=wx.CB_READONLY) 78 vbs.Add(self._format, 0, wx.EXPAND|wx.ALL, 5) 79 hbs.Add(vbs, 3, wx.EXPAND|wx.ALL, 5) 80 return hbs
81
82 - def OnBrowse(self, _):
83 with guihelper.WXDialogWrapper(wx.FileDialog(self, defaultFile=self.filenamectrl.GetValue(), 84 wildcard=self._wildcards[self._format.GetValue()], 85 style=wx.SAVE|wx.CHANGE_DIR), 86 True) as (dlg, retcode): 87 if retcode==wx.ID_OK: 88 self.filenamectrl.SetValue(dlg.GetPath())
89
90 - def OnOk(self, _):
91 # do export 92 filename=self.filenamectrl.GetValue() 93 try: 94 _fp=file(filename, 'wt') 95 except: 96 _fp=None 97 if _fp is None: 98 guihelper.MessageDialog(self, 'Failed to open file ['+filename+']', 99 'Export Error') 100 self.EndModal(wx.ID_OK) 101 if self.rows_all.GetValue(): 102 _sms=self._data 103 else: 104 _sms=self._sel_data 105 if self._format.GetValue()==self._formats[0]: 106 self._export_mbox(_fp, _sms) 107 else: 108 self._export_csv(_fp, _sms) 109 _fp.close() 110 self.EndModal(wx.ID_OK)
111
112 - def _export_mbox(self, fp, sms):
113 # export SMS data to mbox format 114 _email_generator=Generator(fp, True) 115 _lfs='\n\n' 116 _keys=sms.keys() 117 _keys.sort() 118 for k in _keys: 119 e=sms[k] 120 try: 121 _msg=MIMEText(e.text) 122 _msg['From']=e._from or 'self' 123 _msg['To']=e._to or 'self' 124 _msg['Subject']=e.subject 125 if e.datetime: 126 _msg['Date']=formatdate(bptime.BPTime(e.datetime).mktime(), True) 127 _email_generator.flatten(_msg, True) 128 _email_generator.write(_lfs) 129 except: 130 if __debug__: 131 raise
132
133 - def _yesno_str(self, v):
134 if v: 135 return 'Yes' 136 return 'No'
137 - def _datetime_str(self, v):
138 if v: 139 _dt=bptime.BPTime(v) 140 return _dt.date_str()+' '+_dt.time_str() 141 return ''
142 - def _priority_str(self, v):
143 return sms.SMSEntry._priority_name.get(v, '')
144 145 _csv_template=( 146 ('Date', 'datetime', _datetime_str), 147 ('From', '_from', None), 148 ('To', '_to', None), 149 ('Subj', 'subject', None), 150 ('Text', 'text', None), 151 ('Priority', 'priority', _priority_str), 152 ('Read', 'read', _yesno_str), 153 ('Locked', 'locked', _yesno_str), 154 ('Callback', 'callback', None), 155 ('Folder', 'folder', None))
156 - def _export_csv(self, fp, sms):
157 # export SMS data to CSV format 158 # print out the header 159 fp.write(','.join(['"'+e[0]+'"' for e in self._csv_template])+'\n') 160 # and the entries 161 _keys=sms.keys() 162 _keys.sort() 163 for k in _keys: 164 try: 165 e=sms[k] 166 _l=[] 167 for _c in self._csv_template: 168 if _c[2] is None: 169 _s=str(getattr(e, _c[1], '')) 170 else: 171 _s=_c[2](self, getattr(e, _c[1], None)) 172 _l.append('"'+_s.replace('"', '')+'"') 173 fp.write(','.join(_l)+'\n') 174 except: 175 if __debug__: 176 raise
177