1.1 --- a/imip_store.py Tue Sep 23 00:41:22 2014 +0200
1.2 +++ b/imip_store.py Tue Sep 23 16:19:50 2014 +0200
1.3 @@ -1,13 +1,17 @@
1.4 #!/usr/bin/env python
1.5
1.6 -from os.path import abspath, commonprefix, exists, join
1.7 +from os.path import abspath, commonprefix, exists, join, split
1.8 from os import makedirs
1.9 +from vCalendar import iterwrite
1.10
1.11 -STORE_DIR = "/tmp/imip"
1.12 +STORE_DIR = "/var/lib/imip-agent/store"
1.13
1.14 def check_dir(base, dir):
1.15 return commonprefix([base, abspath(dir)]) == base
1.16
1.17 +def to_stream(out, fragment, objtype, encoding="utf-8"):
1.18 + iterwrite(out, encoding=encoding).write(objtype, {}, fragment)
1.19 +
1.20 class FileStore:
1.21
1.22 "A file store of tabular data."
1.23 @@ -17,16 +21,49 @@
1.24 if not exists(self.store_dir):
1.25 makedirs(self.store_dir)
1.26
1.27 - def get_freebusy(self, calendar):
1.28 + def get_file_object(self, base, *parts):
1.29 + pathname = join(base, *parts)
1.30 + return check_dir(base, pathname) and pathname or None
1.31
1.32 - "Get free/busy details from the given 'calendar'."
1.33 + def get_event(self, user, uid):
1.34
1.35 - dir = join(self.store_dir, calendar)
1.36 - if not check_dir(self.store_dir, dir):
1.37 + "Get the event for the given 'user' with the given 'uid'."
1.38 +
1.39 + filename = self.get_file_object(self.store_dir, user, uid)
1.40 + if not filename:
1.41 return None
1.42
1.43 - filename = join(dir, "freebusy")
1.44 - if not exists(filename):
1.45 + return exists(filename) and open(filename) or None
1.46 +
1.47 + def set_event(self, user, uid, details):
1.48 +
1.49 + "Set an event for 'user' having the given 'uid' and 'details'."
1.50 +
1.51 + dir = self.get_file_object(self.store_dir, user)
1.52 + if not dir:
1.53 + return False
1.54 +
1.55 + filename = self.get_file_object(dir, uid)
1.56 + if not filename:
1.57 + return False
1.58 +
1.59 + if not exists(dir):
1.60 + makedirs(dir)
1.61 +
1.62 + f = open(filename, "w")
1.63 + try:
1.64 + to_stream(f, details, "VEVENT")
1.65 + finally:
1.66 + f.close()
1.67 +
1.68 + return True
1.69 +
1.70 + def get_freebusy(self, user):
1.71 +
1.72 + "Get free/busy details for the given 'user'."
1.73 +
1.74 + filename = self.get_file_object(self.store_dir, user, "freebusy")
1.75 + if not filename or not exists(filename):
1.76 return None
1.77
1.78 f = open(filename)
1.79 @@ -38,4 +75,26 @@
1.80 finally:
1.81 f.close()
1.82
1.83 + def set_freebusy(self, user, freebusy):
1.84 +
1.85 + "For the given 'user', set 'freebusy' details."
1.86 +
1.87 + filename = self.get_file_object(self.store_dir, user, "freebusy")
1.88 + if not filename:
1.89 + return False
1.90 +
1.91 + dir = split(filename)[0]
1.92 +
1.93 + if not exists(dir):
1.94 + makedirs(dir)
1.95 +
1.96 + f = open(filename, "w")
1.97 + try:
1.98 + for item in freebusy:
1.99 + f.write("\t".join(item) + "\n")
1.100 + finally:
1.101 + f.close()
1.102 +
1.103 + return True
1.104 +
1.105 # vim: tabstop=4 expandtab shiftwidth=4