diff --git a/sat/plugins/plugin_exp_pubsub_schema.py b/sat/plugins/plugin_exp_pubsub_schema.py
index 51875f84..4b34e9e9 100644
--- a/sat/plugins/plugin_exp_pubsub_schema.py
+++ b/sat/plugins/plugin_exp_pubsub_schema.py
@@ -1,6 +1,5 @@
#!/usr/bin/env python3
-
# SAT plugin for Pubsub Schemas
# Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org)
@@ -535,6 +534,7 @@ class PubsubSchema(object):
filters=filters,
)
d.addCallback(self._p.transItemsData)
+ d.addCallback(lambda data: data_format.serialise(data))
return d
def prepareBridgeSet(self, service, node, schema, item_id, extra, profile_key):
@@ -601,7 +601,7 @@ class PubsubSchema(object):
client, service, node, schema, item_id, extra = self.prepareBridgeSet(
service, node, schema, item_id, extra
)
- d = self.set(
+ d = defer.ensureDeferred(self.set(
client,
service,
node,
@@ -613,12 +613,12 @@ class PubsubSchema(object):
form_ns=form_ns,
default_node=default_node,
fill_author=fill_author,
- )
+ ))
d.addCallback(lambda ret: ret or "")
return d
- @defer.inlineCallbacks
- def set(self, client, service, node, values, schema, item_id, extra, deserialise,
+ async def set(
+ self, client, service, node, values, schema, item_id, extra, deserialise,
form_ns, default_node=None, fill_author=True):
"""Set an item in a node with a schema
@@ -651,19 +651,19 @@ class PubsubSchema(object):
raise exceptions.DataError(
_('if extra["update"] is set, item_id must be set too')
)
- yield self.copyMissingValues(client, service, node, item_id, form_ns, values)
+ await self.copyMissingValues(client, service, node, item_id, form_ns, values)
values["updated"] = now
if fill_author:
if not values.get("author"):
- id_data = yield self._i.getIdentity(client, None, ["nicknames"])
+ id_data = await self._i.getIdentity(client, None, ["nicknames"])
values["author"] = id_data['nicknames'][0]
if not values.get("author_jid"):
values["author_jid"] = client.jid.full()
- item_id = yield self.sendDataFormItem(
+ item_id = await self.sendDataFormItem(
client, service, node, values, schema, item_id, extra, deserialise
)
- defer.returnValue(item_id)
+ return item_id
@implementer(iwokkel.IDisco)
diff --git a/sat/plugins/plugin_misc_merge_requests.py b/sat/plugins/plugin_misc_merge_requests.py
index 11314067..6d9dc035 100644
--- a/sat/plugins/plugin_misc_merge_requests.py
+++ b/sat/plugins/plugin_misc_merge_requests.py
@@ -17,14 +17,16 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+from collections import namedtuple
+from twisted.internet import defer
+from twisted.words.protocols.jabber import jid
from sat.core.i18n import _
from sat.core.constants import Const as C
from sat.core import exceptions
-from twisted.internet import defer
-from twisted.words.protocols.jabber import jid
-from collections import namedtuple
+from sat.tools.common import data_format
from sat.core.log import getLogger
+
log = getLogger(__name__)
NS_MERGE_REQUESTS = 'org.salut-a-toi.merge_requests:0'
@@ -74,7 +76,7 @@ class MergeRequests(object):
self._handlers_list = [] # handlers sorted by priority
self._type_handlers = {} # data type => handler map
host.bridge.addMethod("mergeRequestsGet", ".plugin",
- in_sign='ssiassa{ss}s', out_sign='(asa{ss}aaa{ss})',
+ in_sign='ssiassa{ss}s', out_sign='s',
method=self._get,
async_=True
)
@@ -136,6 +138,15 @@ class MergeRequests(object):
continue
self._type_handlers[data_type] = self._handlers[name]
+ def serialise(self, get_data):
+ tickets_xmlui, metadata, items_patches = get_data
+ tickets_xmlui_s, metadata = self._p.transItemsData((tickets_xmlui, metadata))
+ return data_format.serialise({
+ "items": tickets_xmlui_s,
+ "metadata": metadata,
+ "items_patches": items_patches,
+ })
+
def _get(self, service='', node='', max_items=10, item_ids=None, sub_id=None,
extra_dict=None, profile_key=C.PROF_KEY_NONE):
if extra_dict and 'parse' in extra_dict:
@@ -144,10 +155,7 @@ class MergeRequests(object):
service, node, max_items, sub_id, extra_dict, profile_key)
d = self.get(client, service, node or None, max_items, item_ids, sub_id or None,
extra.rsm_request, extra.extra)
- d.addCallback(lambda tickets_metadata_parsed_patches: (
- self._p.transItemsData((tickets_metadata_parsed_patches[0], tickets_metadata_parsed_patches[1])) +
- ([[{key: str(value) for key, value in p.items()}
- for p in patches] for patches in tickets_metadata_parsed_patches[2]],)))
+ d.addCallback(self.serialise)
return d
@defer.inlineCallbacks
@@ -197,13 +205,16 @@ class MergeRequests(object):
extra="", profile_key=C.PROF_KEY_NONE):
client, service, node, schema, item_id, extra = self._s.prepareBridgeSet(
service, node, schema, item_id, extra, profile_key)
- d = self.set(client, service, node, repository, method, values, schema,
- item_id or None, extra, deserialise=True)
+ d = defer.ensureDeferred(
+ self.set(
+ client, service, node, repository, method, values, schema,
+ item_id or None, extra, deserialise=True
+ )
+ )
d.addCallback(lambda ret: ret or '')
return d
- @defer.inlineCallbacks
- def set(self, client, service, node, repository, method='auto', values=None,
+ async def set(self, client, service, node, repository, method='auto', values=None,
schema=None, item_id=None, extra=None, deserialise=False):
"""Publish a tickets
@@ -234,7 +245,7 @@ class MergeRequests(object):
if method == 'auto':
for name in self._handlers_list:
handler = self._handlers[name].handler
- can_handle = yield handler.check(repository)
+ can_handle = await handler.check(repository)
if can_handle:
log.info(_("{name} handler will be used").format(name=name))
break
@@ -250,20 +261,20 @@ class MergeRequests(object):
except KeyError:
raise exceptions.NotFound(_("No handler of this name found"))
- data = yield handler.export(repository)
+ data = await handler.export(repository)
if not data.strip():
raise exceptions.DataError(_('export data is empty, do you have any '
'change to send?'))
if not values.get('title') or not values.get('body'):
- patches = yield handler.parse(data, values.get(FIELD_DATA_TYPE))
+ patches = await handler.parse(data, values.get(FIELD_DATA_TYPE))
commits_msg = patches[-1][self.META_COMMIT_MSG]
msg_lines = commits_msg.splitlines()
if not values.get('title'):
values['title'] = msg_lines[0]
if not values.get('body'):
ts = self.host.plugins['TEXT_SYNTAXES']
- xhtml = yield ts.convert(
+ xhtml = await ts.convert(
'\n'.join(msg_lines[1:]),
syntax_from = ts.SYNTAX_TEXT,
syntax_to = ts.SYNTAX_XHTML,
@@ -273,9 +284,9 @@ class MergeRequests(object):
values[FIELD_DATA] = data
- item_id = yield self._t.set(client, service, node, values, schema, item_id, extra,
+ item_id = await self._t.set(client, service, node, values, schema, item_id, extra,
deserialise, form_ns=NS_MERGE_REQUESTS)
- defer.returnValue(item_id)
+ return item_id
def _parseData(self, data_type, data):
d = self.parseData(data_type, data)
diff --git a/sat/plugins/plugin_misc_tickets.py b/sat/plugins/plugin_misc_tickets.py
index aa01281a..6ab853ed 100644
--- a/sat/plugins/plugin_misc_tickets.py
+++ b/sat/plugins/plugin_misc_tickets.py
@@ -1,6 +1,5 @@
#!/usr/bin/env python3
-
# SAT plugin for Pubsub Schemas
# Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org)
@@ -52,7 +51,7 @@ class Tickets(object):
"ticketsGet",
".plugin",
in_sign="ssiassa{ss}s",
- out_sign="(asa{ss})",
+ out_sign="s",
method=lambda service, node, max_items, items_ids, sub_id, extra, profile_key:
self._s._get(
service,
@@ -95,14 +94,13 @@ class Tickets(object):
client, service, node, schema, item_id, extra = self._s.prepareBridgeSet(
service, node, schema, item_id, extra, profile_key
)
- d = self.set(
+ d = defer.ensureDeferred(self.set(
client, service, node, values, schema, item_id, extra, deserialise=True
- )
+ ))
d.addCallback(lambda ret: ret or "")
return d
- @defer.inlineCallbacks
- def set(self, client, service, node, values, schema=None, item_id=None, extra=None,
+ async def set(self, client, service, node, values, schema=None, item_id=None, extra=None,
deserialise=False, form_ns=NS_TICKETS):
"""Publish a tickets
@@ -124,7 +122,7 @@ class Tickets(object):
node = NS_TICKETS
if not item_id:
- comments_service = yield self._m.getCommentsService(client, service)
+ comments_service = await self._m.getCommentsService(client, service)
# we need to use uuid for comments node, because we don't know item id in
# advance (we don't want to set it ourselves to let the server choose, so we
@@ -140,7 +138,7 @@ class Tickets(object):
self._p.OPT_SEND_ITEM_SUBSCRIBE: 1,
self._p.OPT_PUBLISH_MODEL: self._p.ACCESS_OPEN,
}
- yield self._p.createNode(client, comments_service, comments_node, options)
+ await self._p.createNode(client, comments_service, comments_node, options)
values["comments_uri"] = uri.buildXMPPUri(
"pubsub",
subtype="microblog",
@@ -148,7 +146,6 @@ class Tickets(object):
node=comments_node,
)
- item_id = yield self._s.set(
+ return await self._s.set(
client, service, node, values, schema, item_id, extra, deserialise, form_ns
)
- defer.returnValue(item_id)
diff --git a/sat_frontends/jp/cmd_merge_request.py b/sat_frontends/jp/cmd_merge_request.py
index 8bfa4064..b0e1501c 100644
--- a/sat_frontends/jp/cmd_merge_request.py
+++ b/sat_frontends/jp/cmd_merge_request.py
@@ -129,14 +129,16 @@ class Get(base.CommandBase):
self, os.getcwd(), "merge requests", meta_map={})
extra = {}
try:
- requests_data = await self.host.bridge.mergeRequestsGet(
- self.args.service,
- self.args.node,
- self.args.max,
- self.args.items,
- "",
- extra,
- self.profile,
+ requests_data = data_format.deserialise(
+ await self.host.bridge.mergeRequestsGet(
+ self.args.service,
+ self.args.node,
+ self.args.max,
+ self.args.items,
+ "",
+ extra,
+ self.profile,
+ )
)
except Exception as e:
self.disp(f"can't get merge request: {e}", error=True)
@@ -146,7 +148,7 @@ class Get(base.CommandBase):
whitelist = None
else:
whitelist = {"id", "title", "body"}
- for request_xmlui in requests_data[0]:
+ for request_xmlui in requests_data['items']:
xmlui = xmlui_manager.create(self.host, request_xmlui, whitelist=whitelist)
await xmlui.show(values_only=True)
self.disp("")
diff --git a/sat_frontends/jp/cmd_ticket.py b/sat_frontends/jp/cmd_ticket.py
index 3c23792a..2e5e6772 100644
--- a/sat_frontends/jp/cmd_ticket.py
+++ b/sat_frontends/jp/cmd_ticket.py
@@ -18,12 +18,13 @@
# along with this program. If not, see .
-from . import base
-from sat.core.i18n import _
-from sat_frontends.jp import common
-from sat_frontends.jp.constants import Const as C
import json
import os
+from sat.core.i18n import _
+from sat.tools.common import data_format
+from sat_frontends.jp import common
+from sat_frontends.jp.constants import Const as C
+from . import base
__commands__ = ["Ticket"]
@@ -50,14 +51,17 @@ class Get(base.CommandBase):
async def start(self):
await common.fill_well_known_uri(self, os.getcwd(), "tickets", meta_map={})
try:
- tickets_data = await self.host.bridge.ticketsGet(
- self.args.service,
- self.args.node,
- self.args.max,
- self.args.items,
- "",
- self.getPubsubExtra(),
- self.profile,
+ tickets_data = data_format.deserialise(
+ await self.host.bridge.ticketsGet(
+ self.args.service,
+ self.args.node,
+ self.args.max,
+ self.args.items,
+ "",
+ self.getPubsubExtra(),
+ self.profile,
+ ),
+ type_check=list
)
except Exception as e:
self.disp(f"can't get tickets: {e}", error=True)