# HG changeset patch # User Goffi # Date 1546792611 -3600 # Node ID 3480d4fdf83a966eaea408c58d9af154e2faac8c # Parent 607cfc79e40f3e8358dac043ebc098a9139d6fa8 plugins XEP-0060, XEP-0313: implemented Order-By protoXEP: new "order_by" key can be used in extra data, value can be, for now, "creation" or "modification". diff -r 607cfc79e40f -r 3480d4fdf83a sat/core/constants.py --- a/sat/core/constants.py Sun Jan 06 17:34:56 2019 +0100 +++ b/sat/core/constants.py Sun Jan 06 17:36:51 2019 +0100 @@ -396,6 +396,12 @@ KEY_THUMBNAILS = u"thumbnails" KEY_PROGRESS_ID = u"progress_id" + ## Common extra keys/values ## + KEY_ORDER_BY = u"order_by" + + ORDER_BY_CREATION = u'creation' + ORDER_BY_MODIFICATION = u'modification' + # internationalisation DEFAULT_LOCALE = u"en_GB" diff -r 607cfc79e40f -r 3480d4fdf83a sat/plugins/plugin_exp_pubsub_schema.py --- a/sat/plugins/plugin_exp_pubsub_schema.py Sun Jan 06 17:34:56 2019 +0100 +++ b/sat/plugins/plugin_exp_pubsub_schema.py Sun Jan 06 17:36:51 2019 +0100 @@ -272,21 +272,9 @@ return d @defer.inlineCallbacks - def getDataFormItems( - self, - client, - service, - nodeIdentifier, - schema=None, - max_items=None, - item_ids=None, - sub_id=None, - rsm_request=None, - extra=None, - default_node=None, - form_ns=None, - filters=None, - ): + def getDataFormItems(self, client, service, nodeIdentifier, schema=None, + max_items=None, item_ids=None, sub_id=None, rsm_request=None, + extra=None, default_node=None, form_ns=None, filters=None): """Get items known as being data forms, and convert them to XMLUI @param schema(domish.Element, data_form.Form, None): schema of the node if known @@ -499,19 +487,9 @@ return client, service, node, max_items, extra, sub_id - def _get( - self, - service="", - node="", - max_items=10, - item_ids=None, - sub_id=None, - extra=None, - default_node=None, - form_ns=None, - filters=None, - profile_key=C.PROF_KEY_NONE, - ): + def _get(self, service="", node="", max_items=10, item_ids=None, sub_id=None, + extra=None, default_node=None, form_ns=None, filters=None, + profile_key=C.PROF_KEY_NONE): """Bridge method to retrieve data from node with schema this method is a helper so dependant plugins can use it directly diff -r 607cfc79e40f -r 3480d4fdf83a sat/plugins/plugin_xep_0060.py --- a/sat/plugins/plugin_xep_0060.py Sun Jan 06 17:34:56 2019 +0100 +++ b/sat/plugins/plugin_xep_0060.py Sun Jan 06 17:36:51 2019 +0100 @@ -82,8 +82,8 @@ def __init__(self, host): log.info(_(u"PubSub plugin initialization")) self.host = host - self._rsm = host.plugins.get("XEP-0059") - self._mam = host.plugins.get("XEP-0313") + self._rsm = host.plugins.get(u"XEP-0059") + self._mam = host.plugins.get(u"XEP-0313") self._node_cb = {} # dictionnary of callbacks for node (key: node, value: list of callbacks) self.rt_sessions = sat_defer.RTDeferredSessions() host.bridge.addMethod( @@ -321,6 +321,13 @@ rsm_request = None extra = {} else: + # order-by + if C.KEY_ORDER_BY in extra: + # FIXME: we temporarily manage only one level of ordering + # we need to switch to a fully serialised extra data + # to be able to encode a whole ordered list + extra[C.KEY_ORDER_BY] = [extra.pop(C.KEY_ORDER_BY)] + # rsm if self._rsm is None: rsm_request = None @@ -336,6 +343,7 @@ if mam_request is not None: assert u"mam" not in extra extra[u"mam"] = mam_request + return Extra(rsm_request, extra) def addManagedNode(self, node, **kwargs): @@ -537,7 +545,14 @@ mam_query = extra["mam"] except KeyError: d = client.pubsub_client.items( - service, node, max_items, item_ids, sub_id, None, rsm_request + service = service, + nodeIdentifier = node, + maxItems = max_items, + subscriptionIdentifier = sub_id, + sender = None, + itemIdentifiers = item_ids, + orderBy = extra.get(C.KEY_ORDER_BY), + rsm_request = rsm_request ) # we have no MAM data here, so we add None d.addCallback(lambda data: data + (None,)) @@ -577,11 +592,11 @@ ) ) - def doSubscribe(items): + def doSubscribe(data): self.subscribe(service, node, profile_key=client.profile).addErrback( subscribeEb, service, node ) - return items + return data if subscribe: d.addCallback(doSubscribe) @@ -1324,6 +1339,7 @@ except KeyError: continue + def itemsReceived(self, event): log.debug(u"Pubsub items received") for callback in self._getNodeCallbacks(event.nodeIdentifier, C.PS_ITEMS): diff -r 607cfc79e40f -r 3480d4fdf83a sat/plugins/plugin_xep_0277.py --- a/sat/plugins/plugin_xep_0277.py Sun Jan 06 17:34:56 2019 +0100 +++ b/sat/plugins/plugin_xep_0277.py Sun Jan 06 17:36:51 2019 +0100 @@ -788,15 +788,8 @@ ## get ## - def _mbGet( - self, - service="", - node="", - max_items=10, - item_ids=None, - extra_dict=None, - profile_key=C.PROF_KEY_NONE, - ): + def _mbGet(self, service="", node="", max_items=10, item_ids=None, extra_dict=None, + profile_key=C.PROF_KEY_NONE): """ @param max_items(int): maximum number of item to get, C.NO_LIMIT for no limit @param item_ids (list[unicode]): list of item IDs @@ -816,16 +809,8 @@ ) @defer.inlineCallbacks - def mbGet( - self, - client, - service=None, - node=None, - max_items=10, - item_ids=None, - rsm_request=None, - extra=None, - ): + def mbGet(self, client, service=None, node=None, max_items=10, item_ids=None, + rsm_request=None, extra=None): """Get some microblogs @param service(jid.JID, None): jid of the publisher diff -r 607cfc79e40f -r 3480d4fdf83a sat/plugins/plugin_xep_0313.py --- a/sat/plugins/plugin_xep_0313.py Sun Jan 06 17:34:56 2019 +0100 +++ b/sat/plugins/plugin_xep_0313.py Sun Jan 06 17:36:51 2019 +0100 @@ -162,6 +162,13 @@ if form_args: mam_args["form"] = mam.buildForm(**form_args) + # we only set orderBy if we have other MAM args + # else we would make a MAM query while it's not expected + if u"order_by" in extra and mam_args: + order_by = extra.pop(u"order_by") + assert isinstance(order_by, list) + mam_args["orderBy"] = order_by + return mam.MAMRequest(**mam_args) if mam_args else None def serialise(self, mam_response, data=None):