cronrec.py
author Eugen Sawin <sawine@me73.com>
Fri, 01 Oct 2010 23:23:26 +0200
changeset 8 42c4c96e3ecd
parent 7 878956edb936
child 9 fab8e1981155
permissions -rwxr-xr-x
Added pause and resume.
sawine@6
     1
#!/usr/local/bin/python
sawine@0
     2
sawine@0
     3
"""
sawine@7
     4
tim - A time recording tool, because time is money.
sawine@0
     5
Author: Eugen Sawin (sawine@me73.com)
sawine@7
     6
Dependencies: Python 2.7 and libsqlite3-dev
sawine@0
     7
"""
sawine@0
     8
sawine@1
     9
import os
sawine@2
    10
import sys
sawine@0
    11
import argparse
sawine@2
    12
from datetime import datetime
sawine@3
    13
sawine@3
    14
import db
sawine@0
    15
sawine@1
    16
WD = "working_path"
sawine@1
    17
CONFIG = {WD: str}
sawine@1
    18
CONFIG_SEP = "="
sawine@2
    19
DB_FILE = "cronrec.db"
sawine@1
    20
sawine@1
    21
config = {}
sawine@1
    22
sawine@7
    23
# Try to get the user's home directory path
sawine@1
    24
try: # Windows
sawine@1
    25
	from win32com.shell import shellcon, shell
sawine@1
    26
	HOMEDIR	= shell.SHGetFolderPath(0, shellcon.CSIDL_LOCAL_APPDATA, 0, 0)
sawine@2
    27
except ImportError: # Linux (hopefully)
sawine@1
    28
	HOMEDIR = os.path.expanduser("~")
sawine@1
    29
sawine@1
    30
CONFIG_FILE = "%s/.cronrecrc" % HOMEDIR
sawine@1
    31
sawine@1
    32
def read_config():
sawine@1
    33
	config = {}
sawine@1
    34
	with open(CONFIG_FILE, "r") as config_stream:
sawine@1
    35
		config_lines = [l.split(CONFIG_SEP) for l in config_stream.readlines() 
sawine@1
    36
						if CONFIG_SEP in l]
sawine@1
    37
		for key, value in config_lines:
sawine@1
    38
			key = key.strip().lower()
sawine@1
    39
			value = value.strip()
sawine@1
    40
			if key in CONFIG:
sawine@1
    41
				config[key] = CONFIG[key](value)
sawine@1
    42
	return config
sawine@1
    43
sawine@1
    44
def write_config(config):
sawine@1
    45
	with open(CONFIG_FILE, "w") as config_input:
sawine@1
    46
		config_input.write("\n".join([CONFIG_SEP.join((k, v)) 
sawine@1
    47
							for k, v in config.iteritems() if k in CONFIG]))
sawine@1
    48
sawine@3
    49
def db_file():
sawine@3
    50
	global config
sawine@3
    51
	if WD not in config:
sawine@3
    52
		print "Working directory path is not configured. \
sawine@3
    53
Please use the init command."
sawine@3
    54
		return None
sawine@3
    55
	return config[WD] + "/" + DB_FILE
sawine@3
    56
	
sawine@1
    57
def init(args):
sawine@2
    58
	global config
sawine@1
    59
	last_wd = None
sawine@1
    60
	if WD in config:
sawine@1
    61
		last_wd = config[WD]
sawine@2
    62
	config[WD] = args.working_path
sawine@1
    63
	write_config(config)
sawine@2
    64
	path_exists = os.path.exists(config[WD]) and os.path.isdir(config[WD])
sawine@3
    65
	db_exists = path_exists and os.path.exists(db_file())\
sawine@3
    66
				and os.path.isfile(db_file())
sawine@2
    67
	if last_wd != config[WD]:		
sawine@2
    68
		print "Changed working directory from %s to %s." % (last_wd, config[WD])
sawine@1
    69
	else:
sawine@2
    70
		print "Working directory remains at %s." % config[WD]
sawine@2
    71
	if not path_exists:
sawine@2
    72
		print "Warning: working directory %s does not exist." % config[WD]
sawine@2
    73
		os.makedirs(config[WD])
sawine@2
    74
		print "Working directory %s created." % config[WD]
sawine@2
    75
	elif db_exists:
sawine@3
    76
		print "Database file %s already exists, please delete it before \
sawine@3
    77
initiating a new database at this location." % db_file()
sawine@2
    78
	if not db_exists:
sawine@3
    79
		db.init(db_file())	
sawine@1
    80
sawine@0
    81
def begin(args):
sawine@2
    82
	project = None
sawine@2
    83
	activity = None
sawine@2
    84
	label = args.label.strip()
sawine@2
    85
	if ":" in label:
sawine@2
    86
		project, activity = label.split(":")
sawine@2
    87
	else:
sawine@2
    88
		project = label
sawine@8
    89
	time = datetime.now()
sawine@8
    90
	db.resume(db_file(), None, None, time)
sawine@8
    91
	db.begin(db_file(), project, activity, time)	
sawine@0
    92
    
sawine@0
    93
def end(args):
sawine@5
    94
	project = None
sawine@5
    95
	activity = None
sawine@5
    96
	label = args.label.strip()
sawine@5
    97
	if ":" in label:
sawine@5
    98
		project, activity = label.split(":")
sawine@5
    99
	else:
sawine@5
   100
		project = label
sawine@8
   101
	time = datetime.now()
sawine@8
   102
	db.resume(db_file(), None, None, time)
sawine@8
   103
	db.end(db_file(), project, activity, time)	
sawine@8
   104
sawine@8
   105
def pause(args):
sawine@8
   106
	db.pause(db_file(), None, None, datetime.now())	 
sawine@8
   107
sawine@8
   108
def resume(args):
sawine@8
   109
	db.resume(db_file(), None, None, datetime.now())	
sawine@2
   110
sawine@7
   111
def status(args):
sawine@8
   112
	task = db.status(db_file())
sawine@8
   113
	if task:
sawine@8
   114
		print "Currently active task"
sawine@8
   115
		print "Project: %s Activity: %s" % task
sawine@7
   116
	else:
sawine@8
   117
		print "There is no active task."
sawine@7
   118
sawine@2
   119
def main():
sawine@2
   120
	global config
sawine@1
   121
	config = read_config()
sawine@1
   122
	parser = argparse.ArgumentParser(description="Records time.")
sawine@1
   123
	subs = parser.add_subparsers()
sawine@1
   124
	sub_begin = subs.add_parser("init")
sawine@2
   125
	sub_begin.add_argument("working_path", type=str)
sawine@1
   126
	sub_begin.set_defaults(func=init)
sawine@0
   127
sawine@1
   128
	sub_begin = subs.add_parser("begin")
sawine@2
   129
	sub_begin.add_argument("label", type=str)
sawine@1
   130
	sub_begin.set_defaults(func=begin)
sawine@0
   131
sawine@1
   132
	sub_end = subs.add_parser("end")
sawine@7
   133
	sub_end.add_argument("label", type=str, nargs="?", default="all:all")
sawine@1
   134
	sub_end.set_defaults(func=end)
sawine@0
   135
sawine@8
   136
	sub_end = subs.add_parser("pause")
sawine@8
   137
	sub_end.add_argument("-m", type=str)
sawine@8
   138
	sub_end.set_defaults(func=pause)
sawine@8
   139
sawine@8
   140
	sub_end = subs.add_parser("resume")
sawine@8
   141
	sub_end.add_argument("-m", type=str)
sawine@8
   142
	sub_end.set_defaults(func=resume)
sawine@8
   143
sawine@7
   144
	sub_end = subs.add_parser("status")
sawine@7
   145
	sub_end.set_defaults(func=status)
sawine@7
   146
sawine@1
   147
	args = parser.parse_args()
sawine@1
   148
	args.func(args)
sawine@2
   149
    
sawine@2
   150
if __name__ == "__main__":
sawine@2
   151
	main()