0001 ### BITPIM 0002 ### 0003 ### Copyright (C) 2005 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: outlook_notes.py 2703 2005-12-29 09:21:18Z djpham $ 0009 0010 "Deals with Outlook Notes import stuff" 0011 0012 # System modules 0013 0014 # wxPython modules 0015 import wx 0016 0017 # BitPim modules 0018 import common_calendar 0019 import memo 0020 import outlook_calendar 0021 0022 #------------------------------------------------------------------------------- 0023 class OutlookNotesImportData(outlook_calendar.OutlookCalendarImportData): 0024 _data_keys=[ 0025 # (Outlook field, MemoEntry field, convertor function) 0026 ('Subject', 'subject', None), 0027 ('Body', 'text', None), 0028 ('Categories', 'categories', outlook_calendar.convert_categories), 0029 ('LastModificationTime', 'date', outlook_calendar.to_bp_date), 0030 ] 0031 _default_filter={ 0032 'start': None, 0033 'end': None, 0034 'categories': None, 0035 } 0036 _data_item_class=memo.MemoEntry 0037 _default_folder_type='notes' 0038 0039 def __init__(self, outlook): 0040 self._outlook=outlook 0041 self._data=[] 0042 self._error_list=[] 0043 self._folder=None 0044 self._filter=self._default_filter 0045 self._total_count=0 0046 self._current_count=0 0047 self._update_dlg=None 0048 0049 def _accept(self, e): 0050 # check for the date 0051 _date=e['date'][:3] 0052 if self._filter['start'] is not None and \ 0053 _date<self._filter['start'][:3]: 0054 return False 0055 if self._filter['end'] is not None and \ 0056 _date>self._filter['end'][:3]: 0057 return False 0058 c=self._filter.get('categories', None) 0059 if not c: 0060 # no categories specified => all catefories allowed. 0061 return True 0062 if [x for x in e['categories'] if x in c]: 0063 return True 0064 return False 0065 0066 def _populate_entry(self, entry, memo_entry): 0067 memo_entry.subject=entry.get('subject', None) 0068 memo_entry.text=entry.get('text', '') 0069 if entry.get('date', None): 0070 memo_entry.set_date_isostr('%04d%02d%02dT%02d%02d00'%entry['date']) 0071 v=[] 0072 for k in entry.get('categories', []): 0073 v.append({ 'category': k }) 0074 memo_entry.categories=v 0075 0076 def get(self): 0077 res={} 0078 for k in self._data: 0079 if self._accept(k): 0080 _e=self._data_item_class() 0081 self._populate_entry(k, _e) 0082 res[_e.id]=_e 0083 return res 0084 0085 def get_display_data(self): 0086 cnt=0 0087 res={} 0088 for k in self._data: 0089 if self._accept(k): 0090 res[cnt]=k 0091 cnt+=1 0092 return res 0093 0094 def read_update(self, item, dict, data_obj): 0095 self._current_count += 1 0096 if self._update_dlg: 0097 self._update_dlg.Update(100*self._current_count/self._total_count) 0098 return True 0099 0100 def read(self, folder=None, update_flg=None): 0101 # folder from which to read 0102 if folder is not None: 0103 self._folder=folder 0104 if self._folder is None: 0105 self._folder=self._outlook.getfolderfromid('', True, 0106 self._default_folder_type) 0107 self._update_dlg=update_flg 0108 self._total_count=self._folder.Items.Count 0109 self._current_count=0 0110 self._data, self._error_list=self._outlook.getdata(self._folder, 0111 self._data_keys, 0112 {}, self, 0113 self.read_update) 0114 0115 def set_folder(self, f): 0116 if f is None: 0117 # default folder 0118 self._folder=self._outlook.getfolderfromid('', True, 0119 self._default_folder_type) 0120 else: 0121 self._folder=f 0122 0123 #------------------------------------------------------------------------------- 0124 class FilterDialog(wx.Dialog): 0125 0126 _has_complete_option=False 0127 0128 def __init__(self, parent, id, caption, categories, 0129 style=wx.DEFAULT_DIALOG_STYLE): 0130 super(FilterDialog, self).__init__(parent, id, title=caption, 0131 style=style) 0132 # the main box sizer 0133 bs=wx.BoxSizer(wx.VERTICAL) 0134 # the flex grid sizers for the editable items 0135 main_fgs=wx.FlexGridSizer(0, 1, 0, 0) 0136 fgs=wx.FlexGridSizer(3, 2, 0, 5) 0137 fgs1=wx.FlexGridSizer(0, 1, 0, 0) 0138 fgs2=wx.FlexGridSizer(0, 2, 0, 5) 0139 # set the date options 0140 self.SetDateControls(fgs, fgs1) 0141 # category option 0142 self.__cat_chkbox=wx.CheckBox(self, id=wx.NewId(), label='Categories:', 0143 style=wx.ALIGN_RIGHT) 0144 fgs2.Add(self.__cat_chkbox, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5) 0145 for i,c in enumerate(categories): 0146 if not len(c): 0147 categories[i]='<None>' 0148 self.__cats=wx.CheckListBox(self, choices=categories, size=(160, 50)) 0149 self.__cats.Disable() 0150 fgs2.Add(self.__cats, 0, wx.ALIGN_LEFT, 0) 0151 # completed items only option 0152 if self._has_complete_option: 0153 self._complete_chkbox=wx.CheckBox(self, -1, label='', 0154 style=wx.ALIGN_RIGHT) 0155 fgs2.Add(self._complete_chkbox, 0, wx.ALIGN_RIGHT|wx.TOP|wx.BOTTOM, 5) 0156 fgs2.Add(wx.StaticText(self, -1, 'Non-completed Items Only'), 0157 0, wx.ALIGN_LEFT, 0) 0158 # add everything to the main sizer 0159 main_fgs.Add(fgs, 1, wx.EXPAND|wx.ALL, 0) 0160 main_fgs.Add(fgs1, 1, wx.EXPAND|wx.ALL, 0) 0161 main_fgs.Add(fgs2, 1, wx.EXPAND|wx.ALL, 0) 0162 bs.Add(main_fgs, 1, wx.EXPAND|wx.ALL, 5) 0163 # the buttons 0164 bs.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5) 0165 bs.Add(self.CreateButtonSizer(wx.OK|wx.CANCEL), 0, wx.ALIGN_CENTRE|wx.ALL, 5) 0166 # event handles 0167 wx.EVT_CHECKBOX(self, self._start_date_chkbox.GetId(), self.OnCheckBox) 0168 wx.EVT_CHECKBOX(self, self._end_date_chkbox.GetId(), self.OnCheckBox) 0169 wx.EVT_CHECKBOX(self, self.__cat_chkbox.GetId(), self.OnCheckBox) 0170 # all done 0171 self.SetSizer(bs) 0172 self.SetAutoLayout(True) 0173 bs.Fit(self) 0174 0175 def _set_cats(self, chk_box, c, data): 0176 if data is None: 0177 chk_box.SetValue(False) 0178 c.Disable() 0179 else: 0180 chk_box.SetValue(True) 0181 c.Enable() 0182 for i,d in enumerate(data): 0183 if not len(d): 0184 data[i]='<None>' 0185 for i in range(c.GetCount()): 0186 c.Check(i, c.GetString(i) in data) 0187 0188 def OnCheckBox(self, evt): 0189 evt_id=evt.GetId() 0190 if evt_id==self._start_date_chkbox.GetId(): 0191 w1,w2=self._start_date_chkbox, self._start_date 0192 elif evt_id==self._end_date_chkbox.GetId(): 0193 w1,w2=self._end_date_chkbox, self._end_date 0194 else: 0195 w1,w2=self.__cat_chkbox, self.__cats 0196 if w1.GetValue(): 0197 w2.Enable() 0198 else: 0199 w2.Disable() 0200 0201 def SetDateControls(self, fgs, fgs1): 0202 self._start_date_chkbox=wx.CheckBox(self, id=wx.NewId(), 0203 label='Start Date:', 0204 style=wx.ALIGN_RIGHT) 0205 fgs.Add(self._start_date_chkbox, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTRE_VERTICAL, 0) 0206 self._start_date=wx.calendar.CalendarCtrl(self, -1, wx.DateTime_Now(), 0207 style = wx.calendar.CAL_SUNDAY_FIRST 0208 | wx.calendar.CAL_SEQUENTIAL_MONTH_SELECTION) 0209 self._start_date.Disable() 0210 fgs.Add(self._start_date, 1, wx.ALIGN_LEFT, 5) 0211 self._end_date_chkbox=wx.CheckBox(self, id=wx.NewId(), 0212 label='End Date:', 0213 style=wx.ALIGN_RIGHT) 0214 fgs.Add(self._end_date_chkbox, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTRE_VERTICAL, 0) 0215 self._end_date=wx.calendar.CalendarCtrl(self, -1, wx.DateTime_Now(), 0216 style = wx.calendar.CAL_SUNDAY_FIRST 0217 | wx.calendar.CAL_SEQUENTIAL_MONTH_SELECTION) 0218 self._end_date.Disable() 0219 fgs.Add(self._end_date, 1, wx.ALIGN_LEFT, 5) 0220 0221 def _set_date(self, chk_box, cal, d): 0222 if d is None: 0223 chk_box.SetValue(False) 0224 cal.Disable() 0225 else: 0226 chk_box.SetValue(True) 0227 cal.Enable() 0228 dt=wx.DateTime() 0229 dt.Set(d[2], year=d[0], month=d[1]-1) 0230 cal.SetDate(dt) 0231 0232 def _set_complete(self, v): 0233 if self._has_complete_option: 0234 self._complete_chkbox.SetValue(v) 0235 0236 def set(self, data): 0237 self._set_date(self._start_date_chkbox, self._start_date, 0238 data.get('start', None)) 0239 self._set_date(self._end_date_chkbox, self._end_date, 0240 data.get('end', None)) 0241 self._set_cats(self.__cat_chkbox, self.__cats, 0242 data.get('categories', None)) 0243 self._set_complete(data.get('non_completed', False)) 0244 0245 def get(self): 0246 r={} 0247 if self._start_date_chkbox.GetValue(): 0248 dt=self._start_date.GetDate() 0249 r['start']=(dt.GetYear(), dt.GetMonth()+1, dt.GetDay()) 0250 else: 0251 r['start']=None 0252 if self._end_date_chkbox.GetValue(): 0253 dt=self._end_date.GetDate() 0254 r['end']=(dt.GetYear(), dt.GetMonth()+1, dt.GetDay()) 0255 else: 0256 r['end']=None 0257 if self.__cat_chkbox.GetValue(): 0258 c=[] 0259 for i in range(self.__cats.GetCount()): 0260 if self.__cats.IsChecked(i): 0261 s=self.__cats.GetString(i) 0262 if s=='<None>': 0263 c.append('') 0264 else: 0265 c.append(s) 0266 r['categories']=c 0267 else: 0268 r['categories']=None 0269 if self._has_complete_option: 0270 r['non_completed']=self._complete_chkbox.GetValue() 0271 return r 0272 0273 #------------------------------------------------------------------------------- 0274 0275 class OutlookImportNotesDialog(outlook_calendar.OutlookImportCalDialog): 0276 _column_labels=[ 0277 ('date', 'Last Changed Date', 200, common_calendar.bp_date_str), 0278 ('subject', 'Subject', 400, None), 0279 ('categories', 'Category', 200, common_calendar.category_str) 0280 ] 0281 0282 _config_name='import/notes/outlookdialog' 0283 _browse_label='Outlook Notes Folder:' 0284 _progress_dlg_title='Outlook Notes Import' 0285 _error_dlg_title='Outlook Notes Import Error' 0286 _error_dlg_text='Outlook Notes Items that failed to import:' 0287 _data_class=OutlookNotesImportData 0288 _filter_dlg_class=FilterDialog 0289
Generated by PyXR 0.9.4