PyXR

c:\projects\bitpim\src \ outlook_notes.py



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