1
2
3
4
5
6
7
8
9
10
11 "Be at one with Evolution"
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 import sys
38 import os
39 import re
40
41 if sys.platform!="linux2":
42 raise ImportError()
43
44 try:
45 import bsddb
46 except:
47 raise ImportError()
48
49
50 userdir=os.path.expanduser("~")
51 evolutionpath="evolution/local"
52 evolutionbasedir=os.path.join(userdir, evolutionpath)
53 evolutionexporter = {
54 'command' : "evolution-addressbook-export",
55 'folderid' : "<Evolution Addressbook Exporter>",
56 'name' : "<Evolution Addressbook Exporter>",
57 'type' : ["address book"]
58 }
59
86
89
103
105
106 res={}
107 children=[]
108
109 for f in os.listdir(basedir):
110 p=os.path.join(basedir, f)
111
112
113 if os.path.isdir(p):
114 f=getfsfolders(p)
115 if len(f):
116 children.extend(f)
117 continue
118
119
120 if len(children):
121 lc=[ (child['name'], child) for child in children]
122 lc.sort()
123 children=[child for _, child in lc]
124
125
126
127 if not os.path.isfile(os.path.join(basedir, "folder-metadata.xml")):
128 return children
129
130
131 t=[]
132 for file,type in ( ("mbox", "mailbox"), ("calendar.ics", "calendar"), ("addressbook.db", "address book"),
133 ("tasks.ics", "tasks") ):
134 if os.path.isfile(os.path.join(basedir, file)):
135 t.append(type)
136
137 entry={}
138 entry['dirpath']=basedir
139 entry['name']=os.path.basename(basedir)
140 entry['folderid']=basedir.replace(userdir, "~", 1)
141 entry['type']=t
142 if len(children):
143 entry['children']=children
144
145 for c in children:
146 c['parent']=entry
147
148 return [entry]
149
151 "Return a list of any special folders"
152
153
154
155 evo_version = os.popen(evolutionexporter['command'] + " --version")
156 evo_version_result = evo_version.read()
157 evo_version_status = evo_version.close()
158 if evo_version_status is not None:
159 return []
160
161
162 if evo_version_result.startswith("Gnome evolution 1.4"):
163 return [evolutionexporter]
164 else:
165 return []
166
169
170 -def pickfolder(selectedid=None, parent=None, title="Select Evolution Folder"):
171
172
173
174 import wx
175 import wx.gizmos
176
177 dlg=wx.Dialog(parent, -1, title, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER, size=(450,350))
178 vbs=wx.BoxSizer(wx.VERTICAL)
179
180 tl=wx.gizmos.TreeListCtrl(dlg, -1, style=wx.TR_DEFAULT_STYLE|wx.TR_HIDE_ROOT)
181
182 tl.AddColumn("Name")
183 tl.SetMainColumn(0)
184 tl.AddColumn("Type")
185 tl.SetColumnWidth(0, 300)
186
187
188
189 def addnode(parent, item, selected):
190 node=tl.AppendItem(parent, item['name'])
191 if selected==item['folderid']:
192 tl.SelectItem(node)
193 tl.SetItemText(node, ", ".join(item['type']), 1)
194 tl.SetPyData(node, item)
195 if item.has_key("children"):
196 for child in item['children']:
197 addnode(node, child, selected)
198 tl.Expand(node)
199
200 root=tl.AddRoot("?")
201 tl.SetPyData(root, None)
202
203 for f in getfolders():
204 addnode(root, f, selectedid)
205
206
207 if tl.GetPyData(tl.GetSelection()) is None:
208 child,_=tl.GetFirstChild(root, 1234)
209 tl.SelectItem(child)
210
211 vbs.Add(tl, 1, wx.EXPAND|wx.ALL, 5)
212
213 vbs.Add(wx.StaticLine(dlg, -1, style=wx.LI_HORIZONTAL), 0, wx.EXPAND|wx.ALL, 5)
214
215 vbs.Add(dlg.CreateButtonSizer(wx.OK|wx.CANCEL|wx.HELP), 0, wx.ALIGN_CENTRE|wx.ALL, 5)
216
217 dlg.SetSizer(vbs)
218 dlg.SetAutoLayout(True)
219
220 if dlg.ShowModal()==wx.ID_OK:
221 folderid=tl.GetPyData(tl.GetSelection())['folderid']
222 else:
223 folderid=None
224 dlg.Destroy()
225 return folderid
226
227
228
229
233
235 "Return a folder object given the id"
236
237 f=_findfolder(id)
238 if f is not None:
239 return f['folderid']
240
241 if default:
242
243 for f in getfolders():
244 if "address book" in f['type']:
245 return f["folderid"]
246
247 return getfolders()[0]['folderid']
248
249 return None
250
252 "Recursive function to locate a folder, using Match exception to return the found folder"
253 if node['folderid']==id:
254 raise Match(node)
255 for c in node.get("children", []):
256 __findfolder(c, id)
257
265
266
268 f=_findfolder(id)
269 if f is None:
270 raise AttributeError("No such folder "+id)
271
272 n=[]
273 while f:
274 n=[f['name']]+n
275 f=f.get('parent',None)
276
277 return " / ".join(n)
278
281
282
283 if __name__=="__main__":
284
285 import wx
286 import wx.gizmos
287
288 app=wx.PySimpleApp()
289
290 folder=pickfolder()
291 print folder
292
293 print "\n".join(getcontacts(folder))
294