comparison sat/tools/common/data_objects.py @ 2770:2d353b74010e

tools (common/data_objects): moved BlogItems._parseMetadata to a parsePubSubMetadata function, so it can be used in a more generic way
author Goffi <goffi@goffi.org>
date Fri, 11 Jan 2019 21:38:20 +0100
parents 93a421de0e3d
children 003b8b4b56a7
comparison
equal deleted inserted replaced
2769:9282b289b964 2770:2d353b74010e
29 29
30 from sat.tools.common import uri as xmpp_uri 30 from sat.tools.common import uri as xmpp_uri
31 import urllib 31 import urllib
32 32
33 q = lambda value: urllib.quote(value.encode("utf-8"), safe="@") 33 q = lambda value: urllib.quote(value.encode("utf-8"), safe="@")
34
35
36 def parsePubSubMetadata(metadata, items):
37 """Helper method to have nicer metadata while doing a PubSub request
38
39 The "rsm_index" and "rsm_count" keys will be converted to int
40 The "mam_stable" and "mam_complete" keys will be converted to boolean
41 A "complete" key can have the following values:
42 - True: we are on the last page, i.e. last items have been received
43 - False: we are not on the last page
44 - None: we don't have enough data fo know our position in the pagination
45 @param metadata(dict): dict retrieved fro bridge with request metadata
46 @param items(list): items retrieved (used to determine "complete" value)
47 @return (dict): parsed metadata
48 """
49 data = {}
50 assert "complete" not in metadata
51
52 for key, value in metadata.iteritems():
53 if key in (u"rsm_index", u"rsm_count"):
54 value = int(value)
55 elif key == u"mam_stable":
56 value = C.bool(value)
57 elif key == u"mam_complete":
58 key = u"complete"
59 value = C.bool(value)
60 data[key] = value
61 if u"complete" not in data:
62 index = data.get(u"rsm_index")
63 count = data.get(u"rsm_count")
64 if index is None or count is None:
65 # we don't have enough information to know if the data is complete or not
66 data[u"complete"] = None
67 else:
68 # normally we have a strict equality here but XEP-0059 states
69 # that index MAY be approximative, so just in case…
70 data[u"complete"] = index + len(items) >= count
71 return data
34 72
35 73
36 class BlogItem(object): 74 class BlogItem(object):
37 def __init__(self, mb_data, parent): 75 def __init__(self, mb_data, parent):
38 self.mb_data = mb_data 76 self.mb_data = mb_data
148 186
149 187
150 class BlogItems(object): 188 class BlogItems(object):
151 def __init__(self, mb_data): 189 def __init__(self, mb_data):
152 self.items = [BlogItem(i, self) for i in mb_data[0]] 190 self.items = [BlogItem(i, self) for i in mb_data[0]]
153 self.metadata = self._parseMetadata(mb_data[1]) 191 self.metadata = parsePubSubMetadata(mb_data[1], self.items)
154 192
155 @property 193 @property
156 def service(self): 194 def service(self):
157 return self.metadata[u"service"] 195 return self.metadata[u"service"]
158 196
186 return self.metadata[u"rsm_count"] 224 return self.metadata[u"rsm_count"]
187 225
188 @property 226 @property
189 def complete(self): 227 def complete(self):
190 return self.metadata[u"complete"] 228 return self.metadata[u"complete"]
191
192 def _parseMetadata(self, metadata):
193 data = {}
194
195 for key, value in metadata.iteritems():
196 if key in (u"rsm_index", u"rsm_count"):
197 value = int(value)
198 elif key == u"mam_stable":
199 value = C.bool(value)
200 elif key == u"mam_complete":
201 key = u"complete"
202 value = C.bool(value)
203 data[key] = value
204 if u"complete" not in data:
205 index = data.get(u"rsm_index")
206 count = data.get(u"rsm_count")
207 if index is None or count is None:
208 # we don't have enough information to know if the data is complete or not
209 data[u"complete"] = None
210 else:
211 # normally we have a strict equality here but XEP-0059 states
212 # that index MAY be approximative, so just in case…
213 data[u"complete"] = index + len(self.items) >= count
214 return data
215 229
216 def __len__(self): 230 def __len__(self):
217 return self.items.__len__() 231 return self.items.__len__()
218 232
219 def __missing__(self, key): 233 def __missing__(self, key):