several small improvements
[count_todo_items] / count_todo_items.py
1 #!/usr/bin/env python3
2
3 # configuration options
4 database_filename = "mako_open_todos.csv"
5 caldav_url = "https://mako:{pw}@nimbus.mako.cc/remote.php/dav/calendars/mako/personal/"
6
7 import datetime
8 import mailbox
9 import numpy as np
10 import pandas as pd
11
12 # import caldav stuff
13 import caldav
14 from caldav.elements import dav, cdav
15
16 # read password from a file
17 with open("nextcloud_password_file", "r") as f:
18     nimbus_password = f.read().strip()
19
20 current_timestamp = datetime.datetime.now()
21 data_original = pd.read_csv(database_filename)
22
23 def get_flags_for_maildir (maildir_name):
24     mb_counts = { 'unread' : 0, 'flagged' : 0 }
25
26     mb = mailbox.Maildir(maildir_name)
27
28     for msg in mb:
29         flags = msg.get_flags()
30         if "S" not in flags:
31             mb_counts['unread'] += 1
32         if "F" in flags:
33             mb_counts['flagged'] += 1
34
35     return mb_counts
36
37 def rows_from_mb_counts (source_string, mb_counts):
38     return pd.DataFrame({'time' : current_timestamp,
39                          'source' : source_string,
40                          'feature' : list(mb_counts.keys()),
41                          'count' : list(mb_counts.values())})
42
43 data_email_personal = rows_from_mb_counts("default inbox",
44                                           get_flags_for_maildir("~/incoming/mail/default"))
45
46 data_email_uw = rows_from_mb_counts("UW inbox",
47                                     get_flags_for_maildir("~/incoming/mail/uw-inbox"))
48
49 # load calendar data
50 caldav_client = caldav.DAVClient(caldav_url.format(pw=nimbus_password))
51 cal = caldav_client.principal().calendars()[0]
52
53 caldav_count = np.sum(["PERCENT-COMPLETE:100" not in c.data
54                        for c in cal.todos(include_completed=True)])
55
56 data_nextcloud = pd.DataFrame({'time' : [current_timestamp],
57                                'source' : ['nextcloud tasks'],
58                                'feature' : ['open'],
59                                'count' : [caldav_count]})
60
61 ## write things out to the data file
62 pd.concat([data_original,
63            data_email_personal,
64            data_email_uw,
65            data_nextcloud]).to_csv(database_filename, index=False)

Benjamin Mako Hill || Want to submit a patch?