1
2
3
4
5
6
7
8
9
10 "Deals with Outlook Notes import stuff"
11
12
13
14
15 import wx
16
17
18 import common_calendar
19 import memo
20 import outlook_calendar
21
22
24 _data_keys=[
25
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
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
50
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
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
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
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
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
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
122
123
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
133 bs=wx.BoxSizer(wx.VERTICAL)
134
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
140 self.SetDateControls(fgs, fgs1)
141
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
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
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
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
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
171 self.SetSizer(bs)
172 self.SetAutoLayout(True)
173 bs.Fit(self)
174
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
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
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
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
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
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
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