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

Reply via email to