1.1 --- a/imiptools/stores/file.py Wed May 11 14:04:30 2016 +0200
1.2 +++ b/imiptools/stores/file.py Wed May 11 15:59:28 2016 +0200
1.3 @@ -26,7 +26,9 @@
1.4 from imiptools.data import make_calendar, parse_object, to_stream
1.5 from imiptools.dates import format_datetime, get_datetime, to_timezone
1.6 from imiptools.filesys import fix_permissions, FileBase
1.7 -from imiptools.period import FreeBusyPeriod, FreeBusyCollection
1.8 +from imiptools.period import FreeBusyPeriod, FreeBusyGroupPeriod, \
1.9 + FreeBusyOfferPeriod, FreeBusyCollection, \
1.10 + FreeBusyGroupCollection, FreeBusyOffersCollection
1.11 from imiptools.text import parse_line
1.12 from os.path import isdir, isfile, join
1.13 from os import listdir, remove, rmdir
1.14 @@ -148,6 +150,18 @@
1.15 finally:
1.16 self.release_lock(user)
1.17
1.18 + def _set_freebusy(self, user, freebusy, filename):
1.19 +
1.20 + """
1.21 + For the given 'user', convert the 'freebusy' details to a form suitable
1.22 + for writing to 'filename'.
1.23 + """
1.24 +
1.25 + # Obtain tuples from the free/busy objects.
1.26 +
1.27 + self._set_table_atomic(user, filename,
1.28 + map(lambda fb: freebusy.make_tuple(fb.as_tuple(strings_only=True)), list(freebusy)))
1.29 +
1.30 class Store(FileStoreBase, StoreBase):
1.31
1.32 "A file store of tabular free/busy data and objects."
1.33 @@ -462,7 +476,7 @@
1.34
1.35 # Free/busy period access.
1.36
1.37 - def get_freebusy(self, user, name=None, mutable=False):
1.38 + def get_freebusy(self, user, name=None, mutable=False, cls=None):
1.39
1.40 "Get free/busy details for the given 'user'."
1.41
1.42 @@ -471,7 +485,8 @@
1.43 if not filename or not isfile(filename):
1.44 periods = []
1.45 else:
1.46 - periods = map(lambda t: FreeBusyPeriod(*t),
1.47 + cls = cls or FreeBusyPeriod
1.48 + periods = map(lambda t: cls(*t),
1.49 self._get_table_atomic(user, filename))
1.50
1.51 return FreeBusyCollection(periods, mutable)
1.52 @@ -498,8 +513,7 @@
1.53 if not filename:
1.54 return False
1.55
1.56 - self._set_table_atomic(user, filename,
1.57 - map(lambda fb: fb.as_tuple(strings_only=True), list(freebusy)))
1.58 + self._set_freebusy(user, freebusy, filename)
1.59 return True
1.60
1.61 def set_freebusy_for_other(self, user, freebusy, other):
1.62 @@ -510,8 +524,7 @@
1.63 if not filename:
1.64 return False
1.65
1.66 - self._set_table_atomic(user, filename,
1.67 - map(lambda fb: fb.as_tuple(strings_only=True), list(freebusy)))
1.68 + self._set_freebusy(user, freebusy, filename)
1.69 return True
1.70
1.71 def get_freebusy_others(self, user):
1.72 @@ -542,7 +555,7 @@
1.73
1.74 self.acquire_lock(user)
1.75 try:
1.76 - l = self.get_freebusy(user, "freebusy-offers")
1.77 + l = self.get_freebusy(user, "freebusy-offers", cls=FreeBusyOfferPeriod)
1.78 for fb in l:
1.79 if fb.expires and get_datetime(fb.expires) <= now:
1.80 expired.append(fb)
1.81 @@ -554,7 +567,7 @@
1.82 finally:
1.83 self.release_lock(user)
1.84
1.85 - return FreeBusyCollection(offers, mutable)
1.86 + return FreeBusyOffersCollection(offers, mutable)
1.87
1.88 # Requests and counter-proposals.
1.89
1.90 @@ -884,7 +897,7 @@
1.91
1.92 return listdir(filename)
1.93
1.94 - def get_freebusy(self, quota, user, mutable=False):
1.95 + def get_freebusy(self, quota, user, mutable=False, cls=None):
1.96
1.97 "Get free/busy details for the given 'quota' and 'user'."
1.98
1.99 @@ -893,7 +906,8 @@
1.100 if not filename or not isfile(filename):
1.101 periods = []
1.102 else:
1.103 - periods = map(lambda t: FreeBusyPeriod(*t),
1.104 + cls = cls or FreeBusyPeriod
1.105 + periods = map(lambda t: cls(*t),
1.106 self._get_table_atomic(quota, filename))
1.107
1.108 return FreeBusyCollection(periods, mutable)
1.109 @@ -906,8 +920,7 @@
1.110 if not filename:
1.111 return False
1.112
1.113 - self._set_table_atomic(quota, filename,
1.114 - map(lambda fb: fb.as_tuple(strings_only=True), list(freebusy)))
1.115 + self._set_freebusy(quota, freebusy, filename)
1.116 return True
1.117
1.118 # Journal entry methods.
1.119 @@ -924,10 +937,10 @@
1.120 if not filename or not isfile(filename):
1.121 periods = []
1.122 else:
1.123 - periods = map(lambda t: FreeBusyPeriod(*t),
1.124 + periods = map(lambda t: FreeBusyGroupPeriod(*t),
1.125 self._get_table_atomic(quota, filename))
1.126
1.127 - return FreeBusyCollection(periods, mutable)
1.128 + return FreeBusyGroupCollection(periods, mutable)
1.129
1.130 def set_entries(self, quota, group, entries):
1.131
1.132 @@ -940,8 +953,7 @@
1.133 if not filename:
1.134 return False
1.135
1.136 - self._set_table_atomic(quota, filename,
1.137 - map(lambda fb: fb.as_tuple(strings_only=True), list(entries)))
1.138 + self._set_freebusy(quota, entries, filename)
1.139 return True
1.140
1.141 # vim: tabstop=4 expandtab shiftwidth=4