1 |
douglas |
1131 |
#!/usr/local/bin/python |
2 |
|
|
# Credit Card |
3 |
|
|
# |
4 |
|
|
# Douglas Thrift |
5 |
|
|
# |
6 |
|
|
# $Id$ |
7 |
|
|
|
8 |
|
|
import atom |
9 |
|
|
import base64 |
10 |
|
|
from ConfigParser import SafeConfigParser |
11 |
|
|
from datetime import date, timedelta |
12 |
|
|
import gdata.calendar |
13 |
|
|
import gdata.calendar.service |
14 |
|
|
import optparse |
15 |
|
|
import os.path |
16 |
|
|
|
17 |
|
|
def decode(string): |
18 |
|
|
return base64.b64decode(string.decode('rot13')) |
19 |
|
|
|
20 |
|
|
if __name__ == '__main__': |
21 |
|
|
parser = optparse.OptionParser() |
22 |
|
|
|
23 |
|
|
parser.add_option('-D', '--debug', action = 'store_true', dest = 'debug') |
24 |
|
|
|
25 |
|
|
options = parser.parse_args()[0] |
26 |
|
|
parser = SafeConfigParser() |
27 |
|
|
service = gdata.calendar.service.CalendarService() |
28 |
|
|
|
29 |
|
|
parser.read([os.path.expanduser('~/.creditcard')]) |
30 |
|
|
service.ClientLogin(parser.get('google', 'username'), decode(parser.get('google', 'password'))) |
31 |
|
|
|
32 |
|
|
for section in filter(lambda section: section != 'google', parser.sections()): |
33 |
|
|
exec 'import %s' % section |
34 |
|
|
exec "bank = %s.Bank(parser.get(section, 'username'), decode(parser.get(section, 'password')), options.debug)" % section |
35 |
|
|
|
36 |
|
|
for account in parser.get(section, 'accounts').split(','): |
37 |
|
|
name, account = account.rsplit(' ', 1) |
38 |
|
|
due = bank(account) |
39 |
|
|
today = date.today() |
40 |
|
|
|
41 |
|
|
if due <= today: |
42 |
|
|
continue |
43 |
|
|
|
44 |
|
|
title = '%s Due' % name |
45 |
|
|
query = gdata.calendar.service.CalendarEventQuery('default', 'private', 'full', '"%s"' % title) |
46 |
|
|
query.start_min = str(today) |
47 |
|
|
events = service.CalendarQuery(query).entry |
48 |
|
|
|
49 |
|
|
if events == []: |
50 |
|
|
event = gdata.calendar.CalendarEventEntry() |
51 |
|
|
event.title = atom.Title(text = title) |
52 |
|
|
event.transparency = gdata.calendar.Transparency() |
53 |
|
|
event.transparency.value = 'TRANSPARENT' |
54 |
|
|
event.visibility = gdata.calendar.Visibility() |
55 |
|
|
event.visibility.value = 'PRIVATE' |
56 |
|
|
|
57 |
|
|
event.when.append(gdata.calendar.When(start_time = str(due), end_time = str(due + timedelta(1)))) |
58 |
|
|
event.when[0].reminder.append(gdata.calendar.Reminder(minutes = 10)) |
59 |
|
|
|
60 |
|
|
service.InsertEvent(event, '/calendar/feeds/default/private/full') |
61 |
|
|
else: |
62 |
|
|
for index, event in enumerate(filter(lambda event: event.title.text == title, events)): |
63 |
|
|
if index == 0: |
64 |
|
|
event.transparency.value = 'TRANSPARENT' |
65 |
|
|
event.visibility.value = 'PRIVATE' |
66 |
|
|
event.when[0].start_time = str(due) |
67 |
|
|
event.when[0].end_time = str(due + timedelta(1)) |
68 |
|
|
|
69 |
|
|
if event.when[0].reminder != []: |
70 |
|
|
event.when[0].reminder[0].minutes = str(10) |
71 |
|
|
else: |
72 |
|
|
event.when[0].reminder.append(gdata.calendar.Reminder(minutes = 10)) |
73 |
|
|
|
74 |
|
|
service.UpdateEvent(event.GetEditLink().href, event) |
75 |
|
|
else: |
76 |
|
|
service.DeleteEvent(event.GetEditLink().href) |