changelog shortlog tags changeset files revisions annotate raw

osx/addressbook/edit_default_address.py

changeset 20: b6b0e9bc226d
author: Greg Darke <greg+laptop@tsukasa.net.au>
date: Thu Apr 16 00:45:45 2009 +1000 (10 months ago)
permissions: -rw-r--r--
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
5# This program reads in all of your contact details (from AddressBook) and then
6# turns them into internation numbers (removes the leading 0, and repaces it
7# with +61). This program will also add an area code if it detects one is missing.
8
9import os, sys, time
10reload(sys).setdefaultencoding('utf8') # Hacky
11
12import logging
13logging.basicConfig(level=logging.DEBUG)
14
15try:
16 import AddressBook
17except ImportError:
18 print >>sys.stderr, 'Seems you do not have pyobjc working for this version of python'
19 raise
20
21class dictobject(dict):
22 def __getattr__(self, key):
23 try:
24 return self[key]
25 except KeyError:
26 raise AttributeError, str(key)
27
28 def __setattr__(self, key, value):
29 self[key] = value
30
31def getDisplayName(person):
32 firstName = unicode(person.valueForProperty_(AddressBook.kABFirstNameProperty))
33 lastName = unicode(person.valueForProperty_(AddressBook.kABLastNameProperty))
34 companyName = unicode(person.valueForProperty_(AddressBook.kABOrganizationProperty))
35
36 flags = person.valueForProperty_(AddressBook.kABPersonFlags)
37 if flags is None:
38 flags = 0
39 lastNameFirst = (flags & AddressBook.kABNameOrderingMask) == AddressBook.kABLastNameFirst
40
41 if (flags & AddressBook.kABShowAsMask) == AddressBook.kABShowAsMask:
42 if companyName:
43 return companyName
44
45 if lastName and firstName:
46 if lastNameFirst:
47 return '%s %s' % (lastName, firstName, )
48 else:
49 return '%s %s' % (firstName, lastName, )
50
51 if lastName:
52 return lastName
53 return firstName
54
55def getEmailAddresses(person):
56 lines = []
57 emailAddresses = person.valueForProperty_(AddressBook.kABEmailProperty)
58 for i in xrange(emailAddresses.count()):
59 email = dictobject(
60 address=emailAddresses.valueAtIndex_(i),
61 label=emailAddresses.labelAtIndex_(i),
62 isDefault=emailAddresses.primaryIdentifier()==emailAddresses.identifierAtIndex_(i),
63 )
64 line = '%s %2d\t%10s\t%s' % (
65 '->' if email.isDefault else ' ',
66 i, email.label, email.address,
67 )
68 lines.append(line)
69
70 return '\n'.join(lines)
71
72def changeDefaultEmailAddress(person, index):
73 emails = person.valueForProperty_(AddressBook.kABEmailProperty)
74 if emails.indexForIdentifier_(emails.primaryIdentifier()) == index:
75 return
76 emails = emails.mutableCopy()
77 emails.setPrimaryIdentifier_(emails.identifierAtIndex_(index))
78
79 person.setValue_forProperty_(emails, AddressBook.kABEmailProperty)
80
81def createSearchQuery(values):
82 def _createSingleSearchQuery(prop, value):
83 return AddressBook.ABPerson.searchElementForProperty_label_key_value_comparison_(
84 prop, # Property
85 None, # Label
86 None, # Key
87 value, # Value
88 AddressBook.kABPrefixMatchCaseInsensitive, # Comparison
89 )
90 PROPS = (
91 AddressBook.kABFirstNameProperty,
92 AddressBook.kABLastNameProperty,
93 AddressBook.kABNicknameProperty,
94 )
95
96 innerQuery = []
97 for value in values:
98 query = AddressBook.ABSearchElement.searchElementForConjunction_children_(
99 AddressBook.kABSearchOr,
100 [_createSingleSearchQuery(prop, value) for prop in PROPS],
101 )
102 innerQuery.append(query)
103
104 return AddressBook.ABSearchElement.searchElementForConjunction_children_(
105 AddressBook.kABSearchAnd,
106 innerQuery,
107 )
108
109def clearScreen():
110 sys.stdout.write('\033[H\033[2J')
111 sys.stdout.flush()
112
113def main():
114 book = AddressBook.ABAddressBook.sharedAddressBook()
115
116 def _searchForUser():
117 name = raw_input('Enter name: ')
118 if not name:
119 sys.exit()
120 return None
121 nameElements = name.strip().split()
122 if not nameElements:
123 return None
124 query = createSearchQuery(nameElements)
125 results = book.recordsMatchingSearchElement_(query)
126
127 if len(results) == 0:
128 print 'User not found'
129 return None
130 if len(results) > 1:
131 # Hmm, we need to pick somebody
132 return _pickUserFromList(results)
133 else:
134 return results[0]
135
136 def _pickUserFromList(searchResults):
137 personID = -1
138 while personID < 0 or personID >= len(searchResults):
139 for i, person in enumerate(searchResults):
140 print '%2d\t%s' % (i, getDisplayName(person))
141 personID = raw_input('Person number (enter to cancel): ')
142 if not personID:
143 return None
144 try:
145 personID = int(personID)
146 except ValueError:
147 pass
148 return searchResults[personID]
149
150 def _pickNewDefaultAddress(person):
151 emailID = -1
152 emailAddresses = person.valueForProperty_(AddressBook.kABEmailProperty).count()
153 while emailID < 0 or emailID >= emailAddresses:
154 print 'Email addresses for %s:' % getDisplayName(person)
155 print getEmailAddresses(person)
156 emailID = raw_input('New default address (enter to cancel): ')
157 if not emailID:
158 return None
159 try:
160 emailID = int(emailID)
161 except ValueError:
162 pass
163 return emailID
164
165 clearScreen()
166 try:
167 while True:
168 person = _searchForUser()
169 clearScreen()
170 if person is None:
171 continue
172
173 emailIndex = _pickNewDefaultAddress(person)
174 clearScreen()
175
176 if emailIndex is None:
177 print 'Cancelled change'
178 continue
179 changeDefaultEmailAddress(person, emailIndex)
180 except EOFError:
181 pass
182 finally:
183 book.save()
184
185if __name__ == "__main__":
186 main()