plugin XEP-0277: set "uri" in item2mbdata

This commit is contained in:
Goffi 2020-08-03 08:45:49 +02:00
commit f2085455f7

View file

@ -16,31 +16,36 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from sat.core.i18n import _
from sat.core.constants import Const as C
from sat.core.log import getLogger
import shortuuid
import time
import dateutil
import calendar
import urllib.parse
from typing import Optional
from functools import partial
from twisted.words.protocols.jabber import jid, error
from twisted.words.protocols.jabber.xmlstream import XMPPHandler
from twisted.words.xish import domish
from twisted.internet import defer
from twisted.python import failure
# XXX: sat_tmp.wokkel.pubsub is actually used instead of wokkel version
from wokkel import pubsub
from wokkel import disco, iwokkel
from zope.interface import implementer
from sat.core.i18n import _
from sat.core.constants import Const as C
from sat.core.log import getLogger
from sat.core import exceptions
from sat.core.xmpp import SatXMPPEntity
from sat.tools import xml_tools
from sat.tools import sat_defer
from sat.tools import utils
from sat.tools.common import data_format
from sat.tools.common import uri as xmpp_uri
# XXX: sat_tmp.wokkel.pubsub is actually used instead of wokkel version
from wokkel import pubsub
from wokkel import disco, iwokkel
from zope.interface import implementer
import shortuuid
import time
import dateutil
import calendar
import urllib.parse
log = getLogger(__name__)
@ -185,7 +190,8 @@ class XEP_0277(object):
for item in itemsEvent.items:
if item.name == C.PS_ITEM:
self.item2mbdata(item).addCallbacks(
# FIXME: service and node should be used here
self.item2mbdata(client, item).addCallbacks(
manageItem, lambda failure: None, (C.PS_PUBLISH,)
)
elif item.name == C.PS_RETRACT:
@ -196,11 +202,23 @@ class XEP_0277(object):
## data/item transformation ##
@defer.inlineCallbacks
def item2mbdata(self, item_elt):
def item2mbdata(
self,
client: SatXMPPEntity,
item_elt: domish.Element,
service: Optional[jid.JID],
# FIXME: node is Optional until all calls to item2mbdata set properly service
# and node. Once done, the Optional must be removed here
node: Optional[str]
) -> dict:
"""Convert an XML Item to microblog data
@param item_elt: domish.Element of microblog item
@return: microblog data (dictionary)
@param item_elt: microblog item element
@param service: PubSub service where the item has been retrieved
profile's PEP is used when service is None
@param node: PubSub node where the item has been retrieved
if None, "uri" won't be set
@return: microblog data
"""
microblog_data = {}
@ -273,6 +291,16 @@ class XEP_0277(object):
msg = "No atom entry found in the pubsub item {}".format(id_)
raise failure.Failure(exceptions.DataError(msg))
# uri
# FIXME: node should alway be set in the future, check FIXME in method signature
if node is not None:
microblog_data['uri'] = xmpp_uri.buildXMPPUri(
"pubsub",
path=service.full() if service is not None else client.jid.userhost(),
node=node,
item=id_,
)
# language
try:
microblog_data["language"] = entry_elt[(C.NS_XML, "lang")].strip()
@ -857,7 +885,7 @@ class XEP_0277(object):
extra=extra,
)
mb_data = yield self._p.transItemsDataD(
items_data, self.item2mbdata)
items_data, partial(self.item2mbdata, client, service=service, node=node))
defer.returnValue(mb_data)
def parseCommentUrl(self, node_url):
@ -1041,18 +1069,24 @@ class XEP_0277(object):
@param profile_key: %(doc_profile_key)s
"""
client = self.host.getClient(profile_key)
def onSuccess(items_data):
"""convert items elements to list of microblog data in items_data"""
d = self._p.transItemsDataD(items_data, self.item2mbdata, serialise=True)
d = self._p.transItemsDataD(
items_data,
# FIXME: service and node should be used here
partial(self.item2mbdata, client),
serialise=True
)
d.addCallback(lambda serialised: ("", serialised))
return d
profile = self.host.getClient(profile_key).profile
d = self._p.getRTResults(
session_id,
on_success=onSuccess,
on_error=lambda failure: (str(failure.value), ([], {})),
profile=profile,
profile=client.profile,
)
d.addCallback(
lambda ret: (
@ -1226,11 +1260,12 @@ class XEP_0277(object):
if key.startswith("comments") and key.endswith("_service"):
prefix = key[: key.find("_")]
service_s = value
service = jid.JID(service_s)
node = item["{}{}".format(prefix, "_node")]
# time to get the comments
d = self._p.getItems(
client,
jid.JID(service_s),
service,
node,
max_comments,
rsm_request=rsm_comments,
@ -1239,7 +1274,11 @@ class XEP_0277(object):
# then serialise
d.addCallback(
lambda items_data: self._p.transItemsDataD(
items_data, self.item2mbdata, serialise=True
items_data,
partial(
self.item2mbdata, client, service=service, node=node
),
serialise=True
)
)
# with failure handling
@ -1277,7 +1316,9 @@ class XEP_0277(object):
)
d.addCallback(
lambda items_data: self._p.transItemsDataD(
items_data, self.item2mbdata)
items_data,
partial(self.item2mbdata, client, service=service, node=node),
)
)
d.addCallback(getComments)
d.addCallback(lambda items_comments_data: ("", items_comments_data))