Todo List

#!/usr/bin/python
import time
import cPickle
import os
from sys import exit

class BadUserError(Exception):
    pass

def get_integer(retrieve,question,attempts=3):   
    while attempts > 0:
        num = retrieve(question)
        try: # check if the user input is an integer
            return int(num)
        except ValueError:
            print "Opps, You must enter a number!"
        attempts -= 1
    raise BadUserError("Too many incorrect attempts!")
if os.path.exists('todo.dat'):
	try:
		fname = open('todo.dat', 'rb')
		data = cPickle.Unpickler(fname)
		todo = data.load()
	finally:	
		fname.close()
else:
	todo = {}

def get_todo():
	key = raw_input('Enter Todo Title: ')
	print '\n', key, 'has been added.'
	print 'Next, enter date for Todo: '
	curr_date = time.strftime('%Y %m %d', time.gmtime())
	print 'Format as ', curr_date
	yr = get_integer(raw_input,'\nEnter Year: ')
	mt = get_integer(raw_input,'Enter Month: ')
	dy = get_integer(raw_input, 'Enter Day: ')
	hr = get_integer(raw_input,'Enter Hour (24h): ')
	mn = get_integer(raw_input,'Enter Minute (01-59): ')
	value = [yr, mt, dy, hr, mn]
	todo[key] = value
	load_todo(todo)
	print '\nYour current Todo list is: \n'
	for k, v in todo.iteritems():
		print k, 'Date:', v[1],v[2],v[0],'Time:',v[3],':',v[4]
	response = raw_input('\nDo you want to add another Todo? (y/n) ')
	if response == 'y':
		get_todo()
	else:
		print 'Goodbye'

def load_todo(todo):
	fname = open('todo.dat', 'w')
	object = cPickle.Pickler(fname)
	object.dump(todo)
	fname.close()

def del_todo():
	print '\nYour current Todo list is: \n'
	for k, v in todo.iteritems():
		print k
	answer = raw_input('\nWhich Todo do you want to remove? ')
	del todo[answer]
	print '\nDeleted Todo', answer
	print '\nYour current Todo list is: \n' 
	for k, v in todo.iteritems():
		print k
	load_todo(todo)

def start_todo():
	fname = open('todo.dat', 'rb')
	try:
		while True:
			try:
				data = cPickle.Unpickler(fname)
				todo = data.load()
				print '\nYour current Todo list is: \n'
				for k, v in todo.iteritems():
					print k, 'Date:', v[1],v[2],v[0],'Time:',v[3],':',v[4]
			except EOFError:
				break
	finally:
		fname.close()

def menu():
	print '''
	Todo List

	Press A: Add a Todo
	Press S: Show Todo List
	Press D: Remove Todo
	Press X: Exit
	'''
	answer = raw_input('\nEnter > ')
	answer = answer.lower()
	if answer == 'a':
		start = start_todo()
		start
		get_todo()
		menu()
	elif answer == 's':
		answer = answer.lower()
		start = start_todo()
		start
		menu()
	elif answer == 'd':
		answer = answer.lower()
		del_todo()
		menu()
	elif answer == 'x':
		answer = answer.lower()
		print 'Goodbye'
		exit()
	else:
		print 'Goodbye'

#	print k, 'Date:',vals[1],vals[2],vals[0],'Time:',vals[3],':',vals[4]
if __name__ == '__main__':
	menu()