Mercurial > libervia-backend
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): |