1.1 --- a/imiptools/stores/database/common.py Thu Apr 21 23:17:35 2016 +0200
1.2 +++ b/imiptools/stores/database/common.py Thu Apr 21 23:20:57 2016 +0200
1.3 @@ -58,12 +58,36 @@
1.4
1.5 # Event and event metadata access.
1.6
1.7 - def get_events(self, user):
1.8 + def get_all_events(self, user, dirname=None):
1.9 +
1.10 + """
1.11 + Return a set of (uid, recurrenceid) tuples for all events. Unless
1.12 + 'dirname' is specified, only active events are returned; otherwise,
1.13 + events from the given 'dirname' are returned.
1.14 + """
1.15 +
1.16 + columns, values = self.get_event_table_filters(dirname)
1.17 +
1.18 + columns += ["store_user"]
1.19 + values += [user]
1.20 +
1.21 + query, values = self.get_query(
1.22 + "select object_uid, null as object_recurrenceid from objects :condition "
1.23 + "union all "
1.24 + "select object_uid, object_recurrenceid from recurrences :condition",
1.25 + columns, values)
1.26 +
1.27 + self.cursor.execute(query, values)
1.28 + return self.cursor.fetchall()
1.29 +
1.30 + def get_events(self, user, dirname=None):
1.31
1.32 "Return a list of event identifiers."
1.33
1.34 - columns = ["store_user", "status"]
1.35 - values = [user, "active"]
1.36 + columns, values = self.get_event_table_filters(dirname)
1.37 +
1.38 + columns += ["store_user"]
1.39 + values += [user]
1.40
1.41 query, values = self.get_query(
1.42 "select object_uid from objects :condition",
1.43 @@ -72,36 +96,11 @@
1.44 self.cursor.execute(query, values)
1.45 return [r[0] for r in self.cursor.fetchall()]
1.46
1.47 - def get_all_events(self, user):
1.48 -
1.49 - "Return a set of (uid, recurrenceid) tuples for all events."
1.50 -
1.51 - query, values = self.get_query(
1.52 - "select object_uid, null as object_recurrenceid from objects :condition "
1.53 - "union all "
1.54 - "select object_uid, object_recurrenceid from recurrences :condition",
1.55 - ["store_user"], [user])
1.56 -
1.57 - self.cursor.execute(query, values)
1.58 - return self.cursor.fetchall()
1.59 -
1.60 - def get_event_table(self, recurrenceid=None, dirname=None):
1.61 + def get_cancelled_events(self, user):
1.62
1.63 - "Get the table providing events for any specified 'dirname'."
1.64 -
1.65 - if recurrenceid:
1.66 - return self.get_recurrence_table(dirname)
1.67 - else:
1.68 - return self.get_complete_event_table(dirname)
1.69 + "Return a list of event identifiers for cancelled events."
1.70
1.71 - def get_event_table_filters(self, dirname=None):
1.72 -
1.73 - "Get filter details for any specified 'dirname'."
1.74 -
1.75 - if dirname == "cancellations":
1.76 - return ["status"], ["cancelled"]
1.77 - else:
1.78 - return ["status"], ["active"]
1.79 + return self.get_events(user, "cancellations")
1.80
1.81 def get_event(self, user, uid, recurrenceid=None, dirname=None):
1.82
1.83 @@ -131,15 +130,6 @@
1.84 result = self.cursor.fetchone()
1.85 return result and parse_string(result[0], "utf-8")
1.86
1.87 - def get_complete_event_table(self, dirname=None):
1.88 -
1.89 - "Get the table providing events for any specified 'dirname'."
1.90 -
1.91 - if dirname == "counters":
1.92 - return "countered_objects"
1.93 - else:
1.94 - return "objects"
1.95 -
1.96 def get_complete_event(self, user, uid):
1.97
1.98 "Get the event for the given 'user' with the given 'uid'."
1.99 @@ -231,15 +221,6 @@
1.100 self.cursor.execute(query, values)
1.101 return [t[0] for t in self.cursor.fetchall() or []]
1.102
1.103 - def get_recurrence_table(self, dirname=None):
1.104 -
1.105 - "Get the table providing recurrences for any specified 'dirname'."
1.106 -
1.107 - if dirname == "counters":
1.108 - return "countered_recurrences"
1.109 - else:
1.110 - return "recurrences"
1.111 -
1.112 def get_recurrence(self, user, uid, recurrenceid):
1.113
1.114 """
1.115 @@ -320,6 +301,44 @@
1.116 self.cursor.execute(query, values)
1.117 return True
1.118
1.119 + # Event table computation.
1.120 +
1.121 + def get_event_table(self, recurrenceid=None, dirname=None):
1.122 +
1.123 + "Get the table providing events for any specified 'dirname'."
1.124 +
1.125 + if recurrenceid:
1.126 + return self.get_recurrence_table(dirname)
1.127 + else:
1.128 + return self.get_complete_event_table(dirname)
1.129 +
1.130 + def get_event_table_filters(self, dirname=None):
1.131 +
1.132 + "Get filter details for any specified 'dirname'."
1.133 +
1.134 + if dirname == "cancellations":
1.135 + return ["status"], ["cancelled"]
1.136 + else:
1.137 + return ["status"], ["active"]
1.138 +
1.139 + def get_complete_event_table(self, dirname=None):
1.140 +
1.141 + "Get the table providing events for any specified 'dirname'."
1.142 +
1.143 + if dirname == "counters":
1.144 + return "countered_objects"
1.145 + else:
1.146 + return "objects"
1.147 +
1.148 + def get_recurrence_table(self, dirname=None):
1.149 +
1.150 + "Get the table providing recurrences for any specified 'dirname'."
1.151 +
1.152 + if dirname == "counters":
1.153 + return "countered_recurrences"
1.154 + else:
1.155 + return "recurrences"
1.156 +
1.157 # Free/busy period providers, upon extension of the free/busy records.
1.158
1.159 def _get_freebusy_providers(self, user):
1.160 @@ -444,6 +463,23 @@
1.161
1.162 return True
1.163
1.164 + def get_freebusy_others(self, user):
1.165 +
1.166 + """
1.167 + For the given 'user', return a list of other users for whom free/busy
1.168 + information is retained.
1.169 + """
1.170 +
1.171 + columns = ["store_user"]
1.172 + values = [user]
1.173 +
1.174 + query, values = self.get_query(
1.175 + "select distinct other from freebusy_others :condition",
1.176 + columns, values)
1.177 +
1.178 + self.cursor.execute(query, values)
1.179 + return [r[0] for r in self.cursor.fetchall()]
1.180 +
1.181 # Tentative free/busy periods related to countering.
1.182
1.183 def get_freebusy_offers(self, user, mutable=False):
1.184 @@ -812,6 +848,36 @@
1.185 self.cursor.execute(query, values)
1.186 return dict(self.cursor.fetchall())
1.187
1.188 + def set_group(self, quota, store_user, user_group):
1.189 +
1.190 + """
1.191 + For the given 'quota', set a mapping from 'store_user' to 'user_group'.
1.192 + """
1.193 +
1.194 + columns = ["quota", "store_user"]
1.195 + values = [quota, store_user]
1.196 + setcolumns = ["user_group"]
1.197 + setvalues = [user_group]
1.198 +
1.199 + query, values = self.get_query(
1.200 + "update user_groups :set :condition",
1.201 + columns, values, setcolumns, setvalues)
1.202 +
1.203 + self.cursor.execute(query, values)
1.204 +
1.205 + if self.cursor.rowcount > 0:
1.206 + return True
1.207 +
1.208 + columns = ["quota", "store_user", "user_group"]
1.209 + values = [quota, store_user, user_group]
1.210 +
1.211 + query, values = self.get_query(
1.212 + "insert into user_groups (:columns) values (:values)",
1.213 + columns, values)
1.214 +
1.215 + self.cursor.execute(query, values)
1.216 + return True
1.217 +
1.218 def get_limits(self, quota):
1.219
1.220 """
1.221 @@ -862,6 +928,23 @@
1.222
1.223 # Free/busy period access for users within quota groups.
1.224
1.225 + def get_freebusy_users(self, quota):
1.226 +
1.227 + """
1.228 + Return a list of users whose free/busy details are retained for the
1.229 + given 'quota'.
1.230 + """
1.231 +
1.232 + columns = ["quota"]
1.233 + values = [quota]
1.234 +
1.235 + query, values = self.get_query(
1.236 + "select distinct store_user from user_freebusy :condition",
1.237 + columns, values)
1.238 +
1.239 + self.cursor.execute(query)
1.240 + return [r[0] for r in self.cursor.fetchall()]
1.241 +
1.242 def get_freebusy(self, quota, user, mutable=False):
1.243
1.244 "Get free/busy details for the given 'quota' and 'user'."