tools (common/data_objects): moved BlogItems._parseMetadata to a parsePubSubMetadata function, so it can be used in a more generic way
This commit is contained in:
parent
173e192526
commit
6f4c7bd950
1 changed files with 39 additions and 25 deletions
|
|
@ -33,6 +33,44 @@ import urllib
|
|||
q = lambda value: urllib.quote(value.encode("utf-8"), safe="@")
|
||||
|
||||
|
||||
def parsePubSubMetadata(metadata, items):
|
||||
"""Helper method to have nicer metadata while doing a PubSub request
|
||||
|
||||
The "rsm_index" and "rsm_count" keys will be converted to int
|
||||
The "mam_stable" and "mam_complete" keys will be converted to boolean
|
||||
A "complete" key can have the following values:
|
||||
- True: we are on the last page, i.e. last items have been received
|
||||
- False: we are not on the last page
|
||||
- None: we don't have enough data fo know our position in the pagination
|
||||
@param metadata(dict): dict retrieved fro bridge with request metadata
|
||||
@param items(list): items retrieved (used to determine "complete" value)
|
||||
@return (dict): parsed metadata
|
||||
"""
|
||||
data = {}
|
||||
assert "complete" not in metadata
|
||||
|
||||
for key, value in metadata.iteritems():
|
||||
if key in (u"rsm_index", u"rsm_count"):
|
||||
value = int(value)
|
||||
elif key == u"mam_stable":
|
||||
value = C.bool(value)
|
||||
elif key == u"mam_complete":
|
||||
key = u"complete"
|
||||
value = C.bool(value)
|
||||
data[key] = value
|
||||
if u"complete" not in data:
|
||||
index = data.get(u"rsm_index")
|
||||
count = data.get(u"rsm_count")
|
||||
if index is None or count is None:
|
||||
# we don't have enough information to know if the data is complete or not
|
||||
data[u"complete"] = None
|
||||
else:
|
||||
# normally we have a strict equality here but XEP-0059 states
|
||||
# that index MAY be approximative, so just in case…
|
||||
data[u"complete"] = index + len(items) >= count
|
||||
return data
|
||||
|
||||
|
||||
class BlogItem(object):
|
||||
def __init__(self, mb_data, parent):
|
||||
self.mb_data = mb_data
|
||||
|
|
@ -150,7 +188,7 @@ class BlogItem(object):
|
|||
class BlogItems(object):
|
||||
def __init__(self, mb_data):
|
||||
self.items = [BlogItem(i, self) for i in mb_data[0]]
|
||||
self.metadata = self._parseMetadata(mb_data[1])
|
||||
self.metadata = parsePubSubMetadata(mb_data[1], self.items)
|
||||
|
||||
@property
|
||||
def service(self):
|
||||
|
|
@ -189,30 +227,6 @@ class BlogItems(object):
|
|||
def complete(self):
|
||||
return self.metadata[u"complete"]
|
||||
|
||||
def _parseMetadata(self, metadata):
|
||||
data = {}
|
||||
|
||||
for key, value in metadata.iteritems():
|
||||
if key in (u"rsm_index", u"rsm_count"):
|
||||
value = int(value)
|
||||
elif key == u"mam_stable":
|
||||
value = C.bool(value)
|
||||
elif key == u"mam_complete":
|
||||
key = u"complete"
|
||||
value = C.bool(value)
|
||||
data[key] = value
|
||||
if u"complete" not in data:
|
||||
index = data.get(u"rsm_index")
|
||||
count = data.get(u"rsm_count")
|
||||
if index is None or count is None:
|
||||
# we don't have enough information to know if the data is complete or not
|
||||
data[u"complete"] = None
|
||||
else:
|
||||
# normally we have a strict equality here but XEP-0059 states
|
||||
# that index MAY be approximative, so just in case…
|
||||
data[u"complete"] = index + len(self.items) >= count
|
||||
return data
|
||||
|
||||
def __len__(self):
|
||||
return self.items.__len__()
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue