From: Andrew Ruthven Date: Thu, 6 Oct 2011 21:14:34 +0000 (+1300) Subject: Add support for multiple accounts, commandline arguments, minor tidy ups. X-Git-Url: http://git.etc.gen.nz/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c246aca02ee1ae47afd95688b6e93f914f210628;p=gnucash-tools.git Add support for multiple accounts, commandline arguments, minor tidy ups. --- diff --git a/find_todo.py b/find_todo.py index 95c99dd..125aaab 100755 --- a/find_todo.py +++ b/find_todo.py @@ -1,8 +1,10 @@ #!/usr/bin/env python -# find_todo.py -- Find transactions marked "To Do" and update CalDAV. +# find_todo.py -- Find transactions marked "To Do", "AP" and "DD" and update +# CalDAV. # # Copyright (C) 2009, 2010 ParIT Worker Co-operative +# Copyright (C) 2011, Andrew Ruthven # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of @@ -20,7 +22,7 @@ # Boston, MA 02110-1301, USA gnu@gnu.org # # @author Andrew Ruthven -# based on account-anlysis.py by Mark Jenkins, ParIT Worker Co-operative +# based on account-analysis.py by Mark Jenkins, ParIT Worker Co-operative # # python imports @@ -33,7 +35,7 @@ import re import csv import caldav from caldav.elements import dav, cdav -import yaml +import getopt # gnucash imports from gnucash import Session, GncNumeric, Split @@ -81,12 +83,36 @@ def account_from_path(top_account, account_path, original_path=None): def main(): - (gnucash_file) = argv[1] - - account_path = argv[2:] - - # Principal url - url = "https://xxx:xxx@xxx.etc.gen.nz/caldav.php/gnucash/home" + gnucash_file = None + username = None + password = None + url = None + identifier = '@gnucash' + optlist, accounts = getopt.getopt(argv[1:],'f:p:n:s:u:i:h', + ['file=','username=','password=','url=','identifier','help']) + for o, a in optlist: + if o in ( "-f", "--file"): + gnucash_file = a + if o in ("-n", "--username"): + username = a + if o in ("-p", "--password"): + password = a + if o in ("-u", "--url"): + url = a + if o in ("-i", "--identifier"): + identifier = '@' + a + if o in ("-h", "--help"): + usage() + exit() + if gnucash_file == None: + print "please specify a gnucash file or database to use" + exit(1) + + if url == None: + print "Please specify a URL for the CalDAV calendar to use" + exit(1) + + # Find the calender to use client = caldav.DAVClient(url) principal = caldav.Principal(client, url) calendars = principal.calendars() @@ -100,6 +126,27 @@ def main(): gnucash_session = Session(gnucash_file, is_new=False) root_account = gnucash_session.book.get_root_account() + current_events = dict() + + for account in accounts: + process_account(calendar, client, identifier, current_events, root_account, account) + + # Go through the events on the server and remove anything that we've added + # previously that is now stale. + events = calendar.events() + for event in events: + event.load() + if not current_events.has_key(event.instance.vevent.uid.value): + if (re.search(identifier, event.instance.vevent.uid.value)): + print "Event", event, "deleted, %s" % event.instance.vevent.uid.value + event.delete() + + # no save needed, we're just reading.. + gnucash_session.end() + +def process_account(calendar, client, identifier, current_events, root_account, account_name): + account_path = account_name.split(':') + account_of_interest = account_from_path(root_account, account_path) header = """BEGIN:VCALENDAR @@ -108,8 +155,6 @@ PRODID:-//Gnucash//Find Todos//EN """ footer = "END:VCALENDAR" - current_events = dict() - # insert and add all splits in the periods of interest for split in account_of_interest.GetSplitList(): trans = split.parent @@ -117,7 +162,7 @@ PRODID:-//Gnucash//Find Todos//EN num = trans.GetNum() - if (re.search('To Do', num, re.I)): + if (re.search('(To Do|AP|DD)', num, re.I)): split_amount = gnc_numeric_to_python_Decimal(split.GetAmount()) if split_amount < ZERO: @@ -126,19 +171,18 @@ PRODID:-//Gnucash//Find Todos//EN else: type = "credit" - day = trans_date.strftime("%Y%m%dZ"); stamp = datetime.utcnow().strftime("%Y%m%dT%H%M%SZ"); - guid = trans.GetGUID().to_string() + "@gnucash" + guid = trans.GetGUID().to_string() + identifier current_events[guid] = 1 - summary = "%s - %s $%d" % (trans.GetDescription(), type, split_amount) + summary = "%s:%s - %s $%d" % (num, trans.GetDescription(), type, split_amount) ical = header + """BEGIN:VEVENT UID:""" + guid + """ DTSTAMP:""" + stamp + """ DTSTART:""" + day + """ SUMMARY:""" + summary + """ -LOCATION:""" + account.name + """ +LOCATION:""" + account_name + """ END:VEVENT """ + footer @@ -147,33 +191,17 @@ END:VEVENT if summary != event.instance.vevent.summary.value or trans_date != event.instance.vevent.dtstart.value: event.set_data(ical) event.save() - print "Event", event, "updated" + print event, "updated" else: - print "Event", event, "unchanged, skipping" + print event, "unchanged, skipping" except caldav.lib.error.NotFoundError: url = "/caldav.php/gnucash/home/" + guid + ".ics" event = caldav.Event(client, url = url, data = ical, parent = calendar).save() - print "Event", event, "created" + print event, "created" current_events[guid] = 1 else: continue - # Go through the events on the server and remove anything that we've added - # previously that is now stale. - events = calendar.events() - for event in events: - event.load() - if not current_events.has_key(event.instance.vevent.uid.value): - if (re.search('@gnucash', event.instance.vevent.uid.value)): - print "Event", event, "deleted, %s" % event.instance.vevent.uid.value - event.delete() - - # no save needed, we're just reading.. - gnucash_session.end() - - if __name__ == "__main__": main() - -