]> git.rmz.io Git - dotfiles.git/blob - bin/org-agenda
vim: do not set pastetoggle in nvim
[dotfiles.git] / bin / org-agenda
1 #!/bin/python
2
3 from glob import glob
4 from os import path, get_terminal_size
5 import orgparse
6 from datetime import date
7
8 # TODO: read org location from config
9 org_glob = '~/org/**.org'
10 org_todos = ['TODO', 'WAITING', 'NEXT']
11 org_dones = ['DONE', 'CANCELLED']
12
13
14 def org_is_archived(root):
15 return "ARCHIVE" in root.tags
16
17
18 def org_is_overdue(node, end=None):
19 if not node.scheduled:
20 return False
21
22 if node.todo in org_dones:
23 return False
24
25 if node.closed:
26 return False
27
28 if end is None:
29 end = orgparse.date.OrgDate(date.today())
30
31 r = orgparse.date.OrgDate(0, end)
32 return node.scheduled.has_overlap(r)
33
34
35 def org_is_scheduled(node: orgparse.node, start=None, end=None):
36 if not node.scheduled:
37 return False
38
39 if node.todo in org_dones:
40 return False
41
42 if start is None and end is None:
43 return True
44
45 if start is None:
46 start = orgparse.date.OrgDate(0)
47
48 if end is None:
49 end = start
50
51 r = orgparse.date.OrgDate(start, end)
52 return node.scheduled.has_overlap(r)
53
54
55 def format_tags(tags):
56 if not tags:
57 return ""
58 return "".join([":{}:".format(t) for t in tags])
59
60
61 def print_node(node):
62 [f, _] = path.splitext(path.basename(n.env.filename))
63 [cols, rows] = get_terminal_size()
64 wf = 12
65 wh = min(50, cols - wf)
66 wt = cols - wf - wh
67 print("{:<{wf}}{:<{wh}}{:>{wt}}".format(f+":", "{} {}".format(n.todo, n.heading)[:wh], format_tags(n.tags),
68 wf=wf, wh=wh, wt=wt))
69
70
71 nodes_today = []
72 nodes_overdue = []
73 nodes_done_today = []
74 #TODO nodes_deadline
75 for org_file in glob(path.expanduser(org_glob)):
76 with open(org_file) as f:
77 env = orgparse.node.OrgEnv(todos=org_todos, dones=org_dones, filename=org_file)
78 root = orgparse.load(f, env=env)
79 # print(root.env.all_todo_keys)
80 for node in root[1:]:
81 if org_is_archived(node):
82 continue
83 if org_is_overdue(node, date.today()):
84 nodes_overdue.append(node)
85 elif org_is_scheduled(node, date.today()):
86 nodes_today.append(node)
87
88 for n in nodes_overdue:
89 print_node(n)
90 for n in nodes_today:
91 print_node(n)