changelog shortlog tags changeset files revisions annotate raw

osx/addressbook/export_to_alias.py

changeset 20: b6b0e9bc226d
parent:7208db06a898
author: Greg Darke <greg+laptop@tsukasa.net.au>
date: Thu Apr 16 00:45:45 2009 +1000 (15 months ago)
permissions: -rwxr-xr-x
description: Ignore some stuff
1#!/usr/bin/env python
2# Copyright 2009 Greg Darke <greg+laptop@tsukasa.net.au>
3# Licensed for distribution under the GPL version 2, check COPYING for details
4
5import os, sys
6reload(sys).setdefaultencoding('utf8') # Hacky
7
8import logging
9logging.basicConfig(level=logging.DEBUG)
10import email.utils
11import string
12
13try:
14 import AddressBook
15except ImportError:
16 print >>sys.stderr, 'Seems you do not have pyobjc working for this version of python'
17 raise
18
19def makeSaneString(s):
20 s = s.lower()
21 return ''.join([c for c in s if c in string.lowercase])
22
23def addIfSane(s, l):
24 s = makeSaneString(s)
25 if s:
26 l.append(s)
27
28def getDisplayName(person):
29 firstName = unicode(person.valueForProperty_(AddressBook.kABFirstNameProperty))
30 lastName = unicode(person.valueForProperty_(AddressBook.kABLastNameProperty))
31 companyName = unicode(person.valueForProperty_(AddressBook.kABOrganizationProperty))
32
33 flags = person.valueForProperty_(AddressBook.kABPersonFlags)
34 if flags is None:
35 flags = 0
36 lastNameFirst = (flags & AddressBook.kABNameOrderingMask) == AddressBook.kABLastNameFirst
37
38 if (flags & AddressBook.kABShowAsMask) == AddressBook.kABShowAsCompany:
39 if companyName:
40 return companyName
41
42 if lastName and firstName:
43 if lastNameFirst:
44 return '%s %s' % (lastName, firstName, )
45 else:
46 return '%s %s' % (firstName, lastName, )
47
48 if lastName:
49 return lastName
50 return firstName
51
52def processPerson(fd, person):
53 logger = logging.getLogger('main.processPerson')
54 emailAddresses = person.valueForProperty_(AddressBook.kABEmailProperty)
55
56 if not emailAddresses:
57 return
58
59 aliasNames = []
60 # Assume first name exists
61 personName = getDisplayName(person)
62 addIfSane(personName, aliasNames)
63
64 if person.valueForProperty_(AddressBook.kABNicknameProperty):
65 addIfSane(unicode(person.valueForProperty_(AddressBook.kABNicknameProperty)), aliasNames)
66
67 defaultIdentifier = emailAddresses.primaryIdentifier()
68 emailAddresses = [
69 (emailAddresses.identifierAtIndex_(i)==defaultIdentifier and -1 or 0, emailAddresses.valueAtIndex_(i))
70 for i in xrange(emailAddresses.count())
71 ]
72 emailAddresses.sort()
73
74 for aliasName in aliasNames:
75 for i, (isDefault, emailAddress) in enumerate(emailAddresses):
76 emailAddress = email.utils.formataddr( (personName, emailAddress) )
77
78 if i > 0:
79 print >>fd, 'alias %s%d %s' % (aliasName, i, emailAddress)
80 else:
81 print >>fd, 'alias %s %s' % (aliasName, emailAddress)
82
83def processGroup(fd, group):
84 members = []
85 for member in group.members():
86 displayName = getDisplayName(member)
87 emailAddresses = member.valueForProperty_(AddressBook.kABEmailProperty)
88 if not emailAddresses:
89 continue
90 emailAddress = emailAddresses.valueForIdentifier_(emailAddresses.primaryIdentifier())
91 members.append(email.utils.formataddr( (getDisplayName(member), emailAddress)))
92 listName = group.valueForProperty_(AddressBook.kABGroupNameProperty)
93 listName = makeSaneString(listName)
94 if listName:
95 print >>fd, 'alias %s %s' % (listName, ', '.join(members))
96
97def main():
98 book = AddressBook.ABAddressBook.sharedAddressBook()
99
100 print >>sys.stdout, '# People'
101 for person in book.people():
102 processPerson(sys.stdout, person)
103
104 print >>sys.stdout, '# Groups'
105 for group in book.groups():
106 processGroup(sys.stdout, group)
107
108if __name__ == "__main__":
109 main()