1.1 --- a/imip_store.py Tue Sep 01 15:59:42 2015 +0200
1.2 +++ b/imip_store.py Tue Sep 01 19:43:40 2015 +0200
1.3 @@ -351,6 +351,30 @@
1.4
1.5 # Free/busy period providers, upon extension of the free/busy records.
1.6
1.7 + def _get_freebusy_providers(self, user):
1.8 +
1.9 + """
1.10 + Return the free/busy providers for the given 'user'.
1.11 +
1.12 + This function returns any stored datetime and a list of providers as a
1.13 + 2-tuple. Each provider is itself a (uid, recurrenceid) tuple.
1.14 + """
1.15 +
1.16 + filename = self.get_object_in_store(user, "freebusy-providers")
1.17 + if not filename or not exists(filename):
1.18 + return None
1.19 +
1.20 + # Attempt to read providers, with a declaration of the datetime
1.21 + # from which such providers are considered as still being active.
1.22 +
1.23 + t = self._get_table(user, filename, [(1, None)])
1.24 + try:
1.25 + dt_string = t[0][0]
1.26 + except IndexError:
1.27 + return None
1.28 +
1.29 + return dt_string, t[1:]
1.30 +
1.31 def get_freebusy_providers(self, user, dt=None):
1.32
1.33 """
1.34 @@ -361,32 +385,39 @@
1.35 details will be returned. Otherwise, if 'dt' is earlier than the
1.36 datetime recorded for the known providers, None is returned, indicating
1.37 that the list of providers must be recomputed.
1.38 +
1.39 + This function returns a list of (uid, recurrenceid) tuples upon success.
1.40 """
1.41
1.42 + t = self._get_freebusy_providers(user)
1.43 + if not t:
1.44 + return None
1.45 +
1.46 + dt_string, t = t
1.47 +
1.48 + # If the requested datetime is earlier than the stated datetime, the
1.49 + # providers will need to be recomputed.
1.50 +
1.51 + if dt:
1.52 + providers_dt = get_datetime(dt_string)
1.53 + if not providers_dt or providers_dt > dt:
1.54 + return None
1.55 +
1.56 + # Otherwise, return the providers.
1.57 +
1.58 + return t[1:]
1.59 +
1.60 + def _set_freebusy_providers(self, user, dt_string, t):
1.61 +
1.62 + "Set the given provider timestamp 'dt_string' and table 't'."
1.63 +
1.64 filename = self.get_object_in_store(user, "freebusy-providers")
1.65 - if not filename or not exists(filename):
1.66 - return None
1.67 - else:
1.68 - # Attempt to read providers, with a declaration of the datetime
1.69 - # from which such providers are considered as still being active.
1.70 -
1.71 - t = self._get_table(user, filename, [(1, None)])
1.72 - try:
1.73 - dt_string = t[0][0]
1.74 - except IndexError:
1.75 - return None
1.76 + if not filename:
1.77 + return False
1.78
1.79 - # If the requested datetime is earlier than the stated datetime, the
1.80 - # providers will need to be recomputed.
1.81 -
1.82 - if dt:
1.83 - providers_dt = get_datetime(dt_string)
1.84 - if not providers_dt or providers_dt > dt:
1.85 - return None
1.86 -
1.87 - # Otherwise, return the providers.
1.88 -
1.89 - return t[1:]
1.90 + t.insert(0, (dt_string,))
1.91 + self._set_table(user, filename, t, [(1, "")])
1.92 + return True
1.93
1.94 def set_freebusy_providers(self, user, dt, providers):
1.95
1.96 @@ -395,17 +426,41 @@
1.97 given datetime 'dt'.
1.98 """
1.99
1.100 - t = [(format_datetime(dt),)]
1.101 + t = []
1.102
1.103 for obj in providers:
1.104 - t.append((obj.get_uid(), obj.get_recurrenceid() or ""))
1.105 + t.append((obj.get_uid(), obj.get_recurrenceid()))
1.106 +
1.107 + return self._set_freebusy_providers(user, format_datetime(dt), t)
1.108
1.109 - filename = self.get_object_in_store(user, "freebusy-providers")
1.110 - if not filename:
1.111 + def append_freebusy_provider(self, user, provider):
1.112 +
1.113 + "For the given 'user', append the free/busy 'provider'."
1.114 +
1.115 + t = self._get_freebusy_providers(user)
1.116 + if not t:
1.117 return False
1.118
1.119 - self._set_table(user, filename, t)
1.120 - return True
1.121 + dt_string, t = t
1.122 + t.append((provider.get_uid(), provider.get_recurrenceid()))
1.123 +
1.124 + return self._set_freebusy_providers(user, dt_string, t)
1.125 +
1.126 + def remove_freebusy_provider(self, user, provider):
1.127 +
1.128 + "For the given 'user', remove the free/busy 'provider'."
1.129 +
1.130 + t = self._get_freebusy_providers(user)
1.131 + if not t:
1.132 + return False
1.133 +
1.134 + dt_string, t = t
1.135 + try:
1.136 + t.remove((provider.get_uid(), provider.get_recurrenceid()))
1.137 + except ValueError:
1.138 + return False
1.139 +
1.140 + return self._set_freebusy_providers(user, dt_string, t)
1.141
1.142 # Free/busy period access.
1.143