I am in the process of learning Python and appscript, and I wrote my first script using these two technologies. Please kindly critique my code - what could I have done better? What would have made this code more Pythonic? Any suggestions and comments are greatly appreciated. Thank You in advance, Marcin --------------------------------------- #!/usr/bin/env /usr/bin/pythonw from appscript import * import sys import cPickle import pprint import datetime def myDebug( txt ): if txt == None: sys.stderr.flush() else: sys.stderr.write( txt ) def getTaskList(): appCal = app( 'iCal' ) cal_todos = appCal.calendars.filter(its.name != '').todos.properties() tasks = [ todo for cals in cal_todos for todo in cals] # Iterate flattened list, builing a local dictionary of dictionaries, by uid tasks_data = {} for task in tasks: if task[ k.class__ ] == k.todo: uid = task[ k.uid ] tasks_data[uid] = task; myDebug('.') myDebug(None) myDebug('\n') return tasks_data def exportTaskListToFile( t_data, filename ): cPickle.dump( t_data, open( filename, 'w' ) ) def importTaskListFromFile( filename ): return cPickle.load( open( filename, 'r' ) ) k_decode = { k.priority : "k.priority", k.due_date : "k.due_date", k.completion_date : "k.completion_date", k.description : "k.description", k.url : "k.url", k.uid : "k.uid", k.summary : "k.summary", k.class__ : "k.class__" } def diffTaskLists( task_list1, task_list2 ): diff_list = [] for uid in [ id for id in task_list1.keys() if task_list2.has_key( id ) ]: t1 = task_list1[uid] t2 = task_list2[uid] found_difference = False for field in [ k.priority, k.due_date, k.completion_date, k.description, k.url, k.summary ]: if t1[field] != t2[field]: if found_difference == False: myDebug( " task ID %s:\n" % str( uid ) ) myDebug( " field %s: " % k_decode[field] ); try: myDebug( "t1 = '%s' t2 = '%s'" % ( t1[field], t2[field] ) ) except: pass myDebug( "\n" ) found_difference = True break if found_difference and t1[k.stamp_date] == t2[k.stamp_date]: diff_list.append( uid ) return diff_list def updateTimeStamp( task_uid_list, timestamp ): myDebug( "Setting new timestamp for task UIDs %s\n" % repr( task_uid_list ) ) for task_uid in task_uid_list: task_list = [ t for t in app('iCal').calendars.todos.filter( its.uid == task_uid ).get() if t != k.MissingValue ] if len( task_list ) > 1: sys.stderr.write( "ERROR: found two tasks with UID %s, updating timestamp for both" % task_uid ) for t in task_list: t.stamp_date.set( timestamp ) def usage(): print "USAGE: " + sys.argv[0] + " save|check" def main(mode): if mode != 'save' and mode != 'check': usage() return myDebug( "Getting list of tasks from iCal...\n" ) tasks = getTaskList() pp = pprint.PrettyPrinter(indent=4) myDebug( "%d tasks\n" % len( tasks ) ) if mode == 'save': myDebug( "Saving current iCal tasks...\n" ) exportTaskListToFile( tasks, 'presync_task_save.tmp' ) sys.stdout.write( "%d tasks saved.\n" % len( tasks ) ) else: myDebug( "Getting saved iCal tasks...\n" ) ref_tasks = importTaskListFromFile( 'presync_task_save.tmp' ) myDebug( "Comparing iCal tasks...\n" ); diff_list = diffTaskLists( ref_tasks, tasks ) pp.pprint( diff_list ) myDebug( "Updating timestamps...\n" ); new_timestamp = datetime.datetime.today() updateTimeStamp( diff_list, new_timestamp ) myDebug( "Done.\n" ) sys.stdout.write( "%d timestamps updated.\n" % len( diff_list ) ) if __name__ == '__main__': if len( sys.argv ) < 2: usage() else: main( sys.argv[1] ) |
_______________________________________________ Pythonmac-SIG maillist - Pythonmac-SIG@python.org http://mail.python.org/mailman/listinfo/pythonmac-sig