# HG changeset patch # User Paul Boddie # Date 1411481990 -7200 # Node ID 47e33c5ec0a7c3ae47382606633136a7a4727a12 # Parent b703d61888edcabba0f42a233139bf28b9d359fd Added support for setting events and free/busy information for users. Added a convenience function for obtaining usable pathnames. Changed the store directory. diff -r b703d61888ed -r 47e33c5ec0a7 imip_store.py --- a/imip_store.py Tue Sep 23 00:41:22 2014 +0200 +++ b/imip_store.py Tue Sep 23 16:19:50 2014 +0200 @@ -1,13 +1,17 @@ #!/usr/bin/env python -from os.path import abspath, commonprefix, exists, join +from os.path import abspath, commonprefix, exists, join, split from os import makedirs +from vCalendar import iterwrite -STORE_DIR = "/tmp/imip" +STORE_DIR = "/var/lib/imip-agent/store" def check_dir(base, dir): return commonprefix([base, abspath(dir)]) == base +def to_stream(out, fragment, objtype, encoding="utf-8"): + iterwrite(out, encoding=encoding).write(objtype, {}, fragment) + class FileStore: "A file store of tabular data." @@ -17,16 +21,49 @@ if not exists(self.store_dir): makedirs(self.store_dir) - def get_freebusy(self, calendar): + def get_file_object(self, base, *parts): + pathname = join(base, *parts) + return check_dir(base, pathname) and pathname or None - "Get free/busy details from the given 'calendar'." + def get_event(self, user, uid): - dir = join(self.store_dir, calendar) - if not check_dir(self.store_dir, dir): + "Get the event for the given 'user' with the given 'uid'." + + filename = self.get_file_object(self.store_dir, user, uid) + if not filename: return None - filename = join(dir, "freebusy") - if not exists(filename): + return exists(filename) and open(filename) or None + + def set_event(self, user, uid, details): + + "Set an event for 'user' having the given 'uid' and 'details'." + + dir = self.get_file_object(self.store_dir, user) + if not dir: + return False + + filename = self.get_file_object(dir, uid) + if not filename: + return False + + if not exists(dir): + makedirs(dir) + + f = open(filename, "w") + try: + to_stream(f, details, "VEVENT") + finally: + f.close() + + return True + + def get_freebusy(self, user): + + "Get free/busy details for the given 'user'." + + filename = self.get_file_object(self.store_dir, user, "freebusy") + if not filename or not exists(filename): return None f = open(filename) @@ -38,4 +75,26 @@ finally: f.close() + def set_freebusy(self, user, freebusy): + + "For the given 'user', set 'freebusy' details." + + filename = self.get_file_object(self.store_dir, user, "freebusy") + if not filename: + return False + + dir = split(filename)[0] + + if not exists(dir): + makedirs(dir) + + f = open(filename, "w") + try: + for item in freebusy: + f.write("\t".join(item) + "\n") + finally: + f.close() + + return True + # vim: tabstop=4 expandtab shiftwidth=4