| Module call_history_export |  | 
  1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10  "Deals with Call History import/export stuff" 
 11   
 12  from __future__ import with_statement 
 13   
 14  import wx 
 15   
 16   
 17  import bptime 
 18  import guihelper 
 19  import phonenumber 
 20   
 21   
 23 -    def __init__(self, parent, title): 
  24          super(ExportCallHistoryDialog, self).__init__(parent, -1, title) 
 25          self._chwidget=parent.GetActiveCallHistoryWidget() 
 26          self._sel_data=self._chwidget.get_selected_data() 
 27          self._data=self._chwidget.get_data() 
 28           
 29          vbs=wx.BoxSizer(wx.VERTICAL) 
 30          hbs=wx.BoxSizer(wx.HORIZONTAL) 
 31          hbs.Add(wx.StaticText(self, -1, "File"), 0, wx.ALL|wx.ALIGN_CENTRE, 5) 
 32          self.filenamectrl=wx.TextCtrl(self, -1, "callhistory_export.csv") 
 33          hbs.Add(self.filenamectrl, 1, wx.ALL|wx.EXPAND, 5) 
 34          self.browsectrl=wx.Button(self, wx.NewId(), "Browse...") 
 35          hbs.Add(self.browsectrl, 0, wx.ALL|wx.EXPAND, 5) 
 36          vbs.Add(hbs, 0, wx.EXPAND|wx.ALL, 5) 
 37           
 38          vbs.Add(self.GetSelectionGui(self), 5, wx.EXPAND|wx.ALL, 5) 
 39           
 40          vbs.Add(wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL), 0, wx.EXPAND|wx.ALL,5) 
 41          vbs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL), 0, wx.ALIGN_CENTER|wx.ALL, 5) 
 42           
 43          wx.EVT_BUTTON(self, self.browsectrl.GetId(), self.OnBrowse) 
 44          wx.EVT_BUTTON(self, wx.ID_OK, self.OnOk) 
 45           
 46          self.SetSizer(vbs) 
 47          self.SetAutoLayout(True) 
 48          vbs.Fit(self) 
  49   
 50 -    def GetSelectionGui(self, parent): 
  51          hbs=wx.BoxSizer(wx.HORIZONTAL) 
 52          rbs=wx.StaticBoxSizer(wx.StaticBox(self, -1, "Call History"), wx.VERTICAL) 
 53          lsel=len(self._sel_data) 
 54          lall=len(self._data) 
 55          self.rows_selected=wx.RadioButton(self, wx.NewId(), "Selected (%d)" % (lsel,), style=wx.RB_GROUP) 
 56          self.rows_all=wx.RadioButton(self, wx.NewId(), "All (%d)" % (lall,)) 
 57          if lsel==0: 
 58              self.rows_selected.Enable(False) 
 59              self.rows_selected.SetValue(0) 
 60              self.rows_all.SetValue(1) 
 61          rbs.Add(self.rows_selected, 0, wx.EXPAND|wx.ALL, 2) 
 62          hbs.Add(rbs, 3, wx.EXPAND|wx.ALL, 5) 
 63          rbs.Add(self.rows_all, 0, wx.EXPAND|wx.ALL, 2) 
 64          return hbs 
  65   
 66 -    def OnBrowse(self, _): 
  67          with guihelper.WXDialogWrapper(wx.FileDialog(self, defaultFile=self.filenamectrl.GetValue(), 
 68                                                       wildcard="CSV files (*.csv)|*.csv", style=wx.SAVE|wx.CHANGE_DIR), 
 69                                         True) as (dlg, retcode): 
 70              if retcode==wx.ID_OK: 
 71                  self.filenamectrl.SetValue(dlg.GetPath()) 
  72   
 74           
 75          filename=self.filenamectrl.GetValue() 
 76          try: 
 77              _fp=file(filename, 'wt') 
 78          except: 
 79              _fp=None 
 80          if _fp is None: 
 81              guihelper.MessageDialog(self, 'Failed to open file ['+filename+']', 
 82                                      'Export Error') 
 83              self.EndModal(wx.ID_OK) 
 84          if self.rows_all.GetValue(): 
 85              _data=self._data 
 86          else: 
 87              _data=self._sel_data 
 88          self._export_csv(_fp, _data) 
 89          _fp.close() 
 90          self.EndModal(wx.ID_OK) 
  91   
 92 -    def _datetime_str(self, v): 
  93          _dt=bptime.BPTime(v) 
 94          return _dt.date_str()+' '+_dt.time_str() 
  95 -    def _phonenumber_str(self, v): 
  98          if v is None or not isinstance(v, int): 
 99              return '' 
100          else: 
101              return '%02d:%02d:%02d'%(v/3600, v/60, v%60) 
 102   
103      _csv_template=( 
104          ('Date', 'datetime', _datetime_str), 
105          ('Number', 'number', _phonenumber_str), 
106          ('Name', 'name', None), 
107          ('Duration', 'duration', _hms), 
108          ('Type', 'folder', None)) 
109 -    def _export_csv(self, fp, ch): 
 110           
111           
112          fp.write(','.join(['"'+e[0]+'"' for e in self._csv_template])+'\n') 
113           
114          _keys=ch.keys() 
115          _keys.sort() 
116          for k in _keys: 
117              try: 
118                  e=ch[k] 
119                  _l=[] 
120                  for _c in self._csv_template: 
121                      if _c[2] is None: 
122                          _s=str(getattr(e, _c[1], '')) 
123                      else: 
124                          _s=_c[2](self, getattr(e, _c[1], None)) 
125                      _l.append('"'+_s.replace('"', '')+'"') 
126                  fp.write(','.join(_l)+'\n') 
127              except: 
128                  if __debug__: 
129                      raise