Added add break command.
1 #!/usr/local/bin/python
4 tim - A time recording tool, because time is money.
5 Author: Eugen Sawin (sawine@me73.com)
6 Dependencies: Python 2.7 and libsqlite3-dev
12 from datetime import datetime
19 DB_FILE = "cronrec.db"
23 # Try to get the user's home directory path
25 from win32com.shell import shellcon, shell
26 HOMEDIR = shell.SHGetFolderPath(0, shellcon.CSIDL_LOCAL_APPDATA, 0, 0)
27 except ImportError: # Linux (hopefully)
28 HOMEDIR = os.path.expanduser("~")
30 CONFIG_FILE = "%s/.cronrecrc" % HOMEDIR
32 DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
36 with open(CONFIG_FILE, "r") as config_stream:
37 config_lines = [l.split(CONFIG_SEP) for l in config_stream.readlines()
39 for key, value in config_lines:
40 key = key.strip().lower()
43 config[key] = CONFIG[key](value)
46 def write_config(config):
47 with open(CONFIG_FILE, "w") as config_input:
48 config_input.write("\n".join([CONFIG_SEP.join((k, v))
49 for k, v in config.iteritems() if k in CONFIG]))
54 print "Working directory path is not configured. \
55 Please use the init command."
57 return config[WD] + "/" + DB_FILE
64 config[WD] = args.working_path
66 path_exists = os.path.exists(config[WD]) and os.path.isdir(config[WD])
67 db_exists = path_exists and os.path.exists(db_file())\
68 and os.path.isfile(db_file())
69 if last_wd != config[WD]:
70 print "Changed working directory from %s to %s." % (last_wd, config[WD])
72 print "Working directory remains at %s." % config[WD]
74 print "Warning: working directory %s does not exist." % config[WD]
75 os.makedirs(config[WD])
76 print "Working directory %s created." % config[WD]
78 print "Database file %s already exists, please delete it before \
79 initiating a new database at this location." % db_file()
83 def parse_label(label):
86 project, activity = label.split(":")
88 project, activity = (label, None)
89 return project, activity
92 project, activity = parse_label(args.label)
94 db.resume(db_file(), None, None, time)
95 db.begin(db_file(), project, activity, time)
98 project, activity = parse_label(args.label)
100 time = datetime.now()
101 db.resume(db_file(), db.find_active_task(db_file()), time, log)
102 db.end(db_file(), project, activity, time, log)
105 db.pause(db_file(), datetime.now())
108 db.resume(db_file(), None, datetime.now(), args.m)
111 project, activity = parse_label(args.label)
113 begin = datetime.strptime(args.begin, DATETIME_FORMAT)
114 end = datetime.strptime(args.end, DATETIME_FORMAT)
115 db.begin(db_file(), project, activity, begin)
116 db.end(db_file(), project, activity, end, log)
120 begin = datetime.strptime(args.begin, DATETIME_FORMAT)
121 end = datetime.strptime(args.end, DATETIME_FORMAT)
122 db.pause(db_file(), begin)
123 db.resume(db_file(), db.find_active_task(db_file(), begin), end, log)
126 task = db.status(db_file())
128 print "Currently active task"
129 print "Project: %s Activity: %s" % task
131 print "There is no active task."
135 config = read_config()
136 parser = argparse.ArgumentParser(description="Records time.")
137 subs = parser.add_subparsers()
139 sub_init = subs.add_parser("init")
140 sub_init.add_argument("working_path", type=str)
141 sub_init.set_defaults(func=init)
143 sub_begin = subs.add_parser("begin")
144 sub_begin.add_argument("label", type=str)
145 sub_begin.set_defaults(func=begin)
147 sub_end = subs.add_parser("end")
148 sub_end.add_argument("label", type=str, nargs="?", default="all:all")
149 sub_end.add_argument("-m", type=str)
150 sub_end.set_defaults(func=end)
152 sub_pause = subs.add_parser("pause")
153 sub_pause.set_defaults(func=pause)
155 sub_resume = subs.add_parser("resume")
156 sub_resume.add_argument("-m", type=str)
157 sub_resume.set_defaults(func=resume)
159 sub_add = subs.add_parser("add")
160 sub_add_subs = sub_add.add_subparsers()
162 sub_add_task = sub_add_subs.add_parser("task")
163 sub_add_task.add_argument("label", type=str)
164 sub_add_task.add_argument("begin", type=str)
165 sub_add_task.add_argument("end", type=str)
166 sub_add_task.add_argument("-m", type=str)
167 sub_add_task.set_defaults(func=add_task)
169 sub_add_break = sub_add_subs.add_parser("break")
170 sub_add_break.add_argument("begin", type=str)
171 sub_add_break.add_argument("end", type=str)
172 sub_add_break.add_argument("-m", type=str)
173 sub_add_break.set_defaults(func=add_break)
175 sub_status = subs.add_parser("status")
176 sub_status.set_defaults(func=status)
178 args = parser.parse_args()
181 if __name__ == "__main__":