# HG changeset patch # User Paul Boddie # Date 1439412050 -7200 # Node ID e5f8a8e266c1609da850a3129e484e4767b81bfb # Parent fcd0670d31608857323ed8e88fbb184554aeac4e Added support for writing the recurrence-providing events for use in more efficient subsequent generation of free/busy collections. diff -r fcd0670d3160 -r e5f8a8e266c1 imip_store.py --- a/imip_store.py Wed Aug 12 18:23:24 2015 +0200 +++ b/imip_store.py Wed Aug 12 22:40:50 2015 +0200 @@ -348,6 +348,11 @@ """ Return a set of uncancelled events of the form (uid, recurrenceid) providing free/busy details beyond the given datetime 'dt'. + + If 'dt' is not specified, all events previously found to provide + details will be returned. Otherwise, if 'dt' is earlier than the + datetime recorded for the known providers, None is returned, indicating + that the list of providers must be recomputed. """ filename = self.get_object_in_store(user, "freebusy-providers") @@ -375,6 +380,25 @@ return t[1:] + def set_freebusy_providers(self, user, dt, providers): + + """ + Define the uncancelled events providing free/busy details beyond the + given datetime 'dt'. + """ + + t = [(format_datetime(dt),)] + + for obj in providers: + t.append((obj.get_uid(), obj.get_recurrenceid() or "")) + + filename = self.get_object_in_store(user, "freebusy-providers") + if not filename: + return False + + self._set_table(user, filename, t) + return True + # Free/busy period access. def get_freebusy(self, user): diff -r fcd0670d3160 -r e5f8a8e266c1 tools/make_freebusy.py --- a/tools/make_freebusy.py Wed Aug 12 18:23:24 2015 +0200 +++ b/tools/make_freebusy.py Wed Aug 12 22:40:50 2015 +0200 @@ -24,7 +24,8 @@ from bisect import bisect_left from codecs import getwriter from imiptools.data import get_window_end, Object -from imiptools.dates import get_default_timezone +from imiptools.dates import get_default_timezone, to_utc_datetime +from imiptools.period import insert_period from imiptools.profile import Preferences from imip_store import FileStore, FilePublisher import sys @@ -38,10 +39,11 @@ try: user = sys.argv[1] args = sys.argv[2:] - participant = args and args[0] not in ("-n", "-s", "-v") and args[0] or user + participant = args and args[0] not in ("-n", "-s", "-v", "-r") and args[0] or user store_and_publish = "-s" in args include_needs_action = "-n" in args verbose = "-v" in args + reset_updated_list = "-r" in args except IndexError: print >>sys.stderr, """\ Need a user and an optional participant (if different from the user), @@ -67,7 +69,7 @@ # providing free/busy periods at the end of the given time window, or from # a list of all events. - all_events = store.get_freebusy_providers(user, window_end) + all_events = not reset_updated_list and store.get_freebusy_providers(user, window_end) if not all_events: all_events = store.get_active_events(user) @@ -100,11 +102,7 @@ if obj.get_participation(partstat, include_needs_action): for p in obj.get_active_periods(recurrenceids, tzid, window_end): fbp = obj.get_freebusy_period(p, partstat == "ORG") - i = bisect_left(fb, fbp) - if i == len(fb): - fb.append(fbp) - elif fb[i] != fbp: - fb.insert(i, fbp) + insert_period(fb, fbp) # Store and publish the free/busy collection. @@ -112,6 +110,7 @@ if user == participant: store.set_freebusy(user, fb) publisher.set_freebusy(user, fb) + store.set_freebusy_providers(user, to_utc_datetime(window_end, tzid), [obj for obj in objs if obj.possibly_active_from(window_end, tzid)]) else: store.set_freebusy_for_other(user, fb, participant) else: