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

Source Code for Module outlook_notes

  1  ### BITPIM 
  2  ### 
  3  ### Copyright (C) 2005 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: outlook_notes.py 2703 2005-12-29 09:21:18Z djpham $ 
  9   
 10  "Deals with Outlook Notes import stuff" 
 11   
 12  # System modules 
 13   
 14  # wxPython modules 
 15  import wx 
 16   
 17  # BitPim modules 
 18  import common_calendar 
 19  import memo 
 20  import outlook_calendar 
 21   
 22  #------------------------------------------------------------------------------- 
23 -class OutlookNotesImportData(outlook_calendar.OutlookCalendarImportData):
24 _data_keys=[ 25 # (Outlook field, MemoEntry field, convertor function) 26 ('Subject', 'subject', None), 27 ('Body', 'text', None), 28 ('Categories', 'categories', outlook_calendar.convert_categories), 29 ('LastModificationTime', 'date', outlook_calendar.to_bp_date), 30 ] 31 _default_filter={ 32 'start': None, 33 'end': None, 34 'categories': None, 35 } 36 _data_item_class=memo.MemoEntry 37 _default_folder_type='notes' 38
39 - def __init__(self, outlook):
40 self._outlook=outlook 41 self._data=[] 42 self._error_list=[] 43 self._folder=None 44 self._filter=self._default_filter 45 self._total_count=0 46 self._current_count=0 47 self._update_dlg=None
48
49 - def _accept(self, e):
50 # check for the date 51 _date=e['date'][:3] 52 if self._filter['start'] is not None and \ 53 _date<self._filter['start'][:3]: 54 return False 55 if self._filter['end'] is not None and \ 56 _date>self._filter['end'][:3]: 57 return False 58 c=self._filter.get('categories', None) 59 if not c: 60 # no categories specified => all catefories allowed. 61 return True 62 if [x for x in e['categories'] if x in c]: 63 return True 64 return False
65
66 - def _populate_entry(self, entry, memo_entry):
67 memo_entry.subject=entry.get('subject', None) 68 memo_entry.text=entry.get('text', '') 69 if entry.get('date', None): 70 memo_entry.set_date_isostr('%04d%02d%02dT%02d%02d00'%entry['date']) 71 v=[] 72 for k in entry.get('categories', []): 73 v.append({ 'category': k }) 74 memo_entry.categories=v
75
76 - def get(self):
77 res={} 78 for k in self._data: 79 if self._accept(k): 80 _e=self._data_item_class() 81 self._populate_entry(k, _e) 82 res[_e.id]=_e 83 return res
84
85 - def get_display_data(self):
86 cnt=0 87 res={} 88 for k in self._data: 89 if self._accept(k): 90 res[cnt]=k 91 cnt+=1 92 return res
93
94 - def read_update(self, item, dict, data_obj):
95 self._current_count += 1 96 if self._update_dlg: 97 self._update_dlg.Update(100*self._current_count/self._total_count) 98 return True
99
100 - def read(self, folder=None, update_flg=None):
101 # folder from which to read 102 if folder is not None: 103 self._folder=folder 104 if self._folder is None: 105 self._folder=self._outlook.getfolderfromid('', True, 106 self._default_folder_type) 107 self._update_dlg=update_flg 108 self._total_count=self._folder.Items.Count 109 self._current_count=0 110 self._data, self._error_list=self._outlook.getdata(self._folder, 111 self._data_keys, 112 {}, self, 113 self.read_update)
114
115 - def set_folder(self, f):
116 if f is None: 117 # default folder 118 self._folder=self._outlook.getfolderfromid('', True, 119 self._default_folder_type) 120 else: 121 self._folder=f
122 123 #-------------------------------------------------------------------------------
124 -class FilterDialog(wx.Dialog):
125 126 _has_complete_option=False 127
128 - def __init__(self, parent, id, caption, categories, 129 style=wx.DEFAULT_DIALOG_STYLE):
130 super(FilterDialog, self).__init__(parent, id, title=caption, 131 style=style) 132 # the main box sizer 133 bs=wx.BoxSizer(wx.VERTICAL) 134 # the flex grid sizers for the editable items 135 main_fgs=wx.FlexGridSizer(0, 1, 0, 0) 136 fgs=wx.FlexGridSizer(3, 2, 0, 5) 137 fgs1=wx.FlexGridSizer(0, 1, 0, 0) 138 fgs2=wx.FlexGridSizer(0, 2, 0, 5) 139 # set the date options 140 self.SetDateControls(fgs, fgs1) 141 # category option 142 self.__cat_chkbox=wx.CheckBox(self, id=wx.NewId(), label='Categories:', 143 style=wx.ALIGN_RIGHT) 144 fgs2.Add(self.__cat_chkbox, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5) 145 for i,c in enumerate(categories): 146 if not len(c): 147 categories[i]='<None>' 148 self.__cats=wx.CheckListBox(self, choices=categories, size=(160, 50)) 149 self.__cats.Disable() 150 fgs2.Add(self.__cats, 0, wx.ALIGN_LEFT, 0) 151 # completed items only option 152 if self._has_complete_option: 153 self._complete_chkbox=wx.CheckBox(self, -1, label='', 154 style=wx.ALIGN_RIGHT) 155 fgs2.Add(self._complete_chkbox, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5) 156 fgs2.Add(wx.StaticText(self, -1, 'Non-completed Items Only'), 157 0, wx.ALIGN_LEFT, 0) 158 # add everything to the main sizer 159 main_fgs.Add(fgs, 1, wx.EXPAND|wx.ALL, 0) 160 main_fgs.Add(fgs1, 1, wx.EXPAND|wx.ALL, 0) 161 main_fgs.Add(fgs2, 1, wx.EXPAND|wx.ALL, 0) 162 bs.Add(main_fgs, 1, wx.EXPAND|wx.ALL, 5) 163 # the buttons 164 bs.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5) 165 bs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL), 0, wx.ALIGN_CENTRE|wx.ALL, 5) 166 # event handles 167 wx.EVT_CHECKBOX(self, self._start_date_chkbox.GetId(), self.OnCheckBox) 168 wx.EVT_CHECKBOX(self, self._end_date_chkbox.GetId(), self.OnCheckBox) 169 wx.EVT_CHECKBOX(self, self.__cat_chkbox.GetId(), self.OnCheckBox) 170 # all done 171 self.SetSizer(bs) 172 self.SetAutoLayout(True) 173 bs.Fit(self)
174
175 - def _set_cats(self, chk_box, c, data):
176 if data is None: 177 chk_box.SetValue(False) 178 c.Disable() 179 else: 180 chk_box.SetValue(True) 181 c.Enable() 182 for i,d in enumerate(data): 183 if not len(d): 184 data[i]='<None>' 185 for i in range(c.GetCount()): 186 c.Check(i, c.GetString(i) in data)
187
188 - def OnCheckBox(self, evt):
189 evt_id=evt.GetId() 190 if evt_id==self._start_date_chkbox.GetId(): 191 w1,w2=self._start_date_chkbox, self._start_date 192 elif evt_id==self._end_date_chkbox.GetId(): 193 w1,w2=self._end_date_chkbox, self._end_date 194 else: 195 w1,w2=self.__cat_chkbox, self.__cats 196 if w1.GetValue(): 197 w2.Enable() 198 else: 199 w2.Disable()
200
201 - def SetDateControls(self, fgs, fgs1):
202 self._start_date_chkbox=wx.CheckBox(self, id=wx.NewId(), 203 label='Start Date:', 204 style=wx.ALIGN_RIGHT) 205 fgs.Add(self._start_date_chkbox, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTRE_VERTICAL, 0) 206 self._start_date=wx.calendar.CalendarCtrl(self, -1, wx.DateTime_Now(), 207 style = wx.calendar.CAL_SUNDAY_FIRST 208 | wx.calendar.CAL_SEQUENTIAL_MONTH_SELECTION) 209 self._start_date.Disable() 210 fgs.Add(self._start_date, 1, wx.ALIGN_LEFT, 5) 211 self._end_date_chkbox=wx.CheckBox(self, id=wx.NewId(), 212 label='End Date:', 213 style=wx.ALIGN_RIGHT) 214 fgs.Add(self._end_date_chkbox, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTRE_VERTICAL, 0) 215 self._end_date=wx.calendar.CalendarCtrl(self, -1, wx.DateTime_Now(), 216 style = wx.calendar.CAL_SUNDAY_FIRST 217 | wx.calendar.CAL_SEQUENTIAL_MONTH_SELECTION) 218 self._end_date.Disable() 219 fgs.Add(self._end_date, 1, wx.ALIGN_LEFT, 5)
220
221 - def _set_date(self, chk_box, cal, d):
222 if d is None: 223 chk_box.SetValue(False) 224 cal.Disable() 225 else: 226 chk_box.SetValue(True) 227 cal.Enable() 228 dt=wx.DateTime() 229 dt.Set(d[2], year=d[0], month=d[1]-1) 230 cal.SetDate(dt)
231
232 - def _set_complete(self, v):
233 if self._has_complete_option: 234 self._complete_chkbox.SetValue(v)
235
236 - def set(self, data):
237 self._set_date(self._start_date_chkbox, self._start_date, 238 data.get('start', None)) 239 self._set_date(self._end_date_chkbox, self._end_date, 240 data.get('end', None)) 241 self._set_cats(self.__cat_chkbox, self.__cats, 242 data.get('categories', None)) 243 self._set_complete(data.get('non_completed', False))
244
245 - def get(self):
246 r={} 247 if self._start_date_chkbox.GetValue(): 248 dt=self._start_date.GetDate() 249 r['start']=(dt.GetYear(), dt.GetMonth()+1, dt.GetDay()) 250 else: 251 r['start']=None 252 if self._end_date_chkbox.GetValue(): 253 dt=self._end_date.GetDate() 254 r['end']=(dt.GetYear(), dt.GetMonth()+1, dt.GetDay()) 255 else: 256 r['end']=None 257 if self.__cat_chkbox.GetValue(): 258 c=[] 259 for i in range(self.__cats.GetCount()): 260 if self.__cats.IsChecked(i): 261 s=self.__cats.GetString(i) 262 if s=='<None>': 263 c.append('') 264 else: 265 c.append(s) 266 r['categories']=c 267 else: 268 r['categories']=None 269 if self._has_complete_option: 270 r['non_completed']=self._complete_chkbox.GetValue() 271 return r
272 273 #------------------------------------------------------------------------------- 274
275 -class OutlookImportNotesDialog(outlook_calendar.OutlookImportCalDialog):
276 _column_labels=[ 277 ('date', 'Last Changed Date', 200, common_calendar.bp_date_str), 278 ('subject', 'Subject', 400, None), 279 ('categories', 'Category', 200, common_calendar.category_str) 280 ] 281 282 _config_name='import/notes/outlookdialog' 283 _browse_label='Outlook Notes Folder:' 284 _progress_dlg_title='Outlook Notes Import' 285 _error_dlg_title='Outlook Notes Import Error' 286 _error_dlg_text='Outlook Notes Items that failed to import:' 287 _data_class=OutlookNotesImportData 288 _filter_dlg_class=FilterDialog
289