# HG changeset patch # User Goffi # Date 1594883246 -7200 # Node ID 71761e9fb984d2178876d7e506dcc2cb6cf2f581 # Parent 384283adcce1368d8a6d4fd765d91d1942a275dc plugins tickets, merge-requests: `ticketsGet` and `mergeRequestsGet` serialisation: those methods now return data serialised with `data_format.serialise` diff -r 384283adcce1 -r 71761e9fb984 sat/plugins/plugin_exp_pubsub_schema.py --- a/sat/plugins/plugin_exp_pubsub_schema.py Thu Jul 16 09:07:20 2020 +0200 +++ b/sat/plugins/plugin_exp_pubsub_schema.py Thu Jul 16 09:07:26 2020 +0200 @@ -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 @@ 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 @@ 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 @@ 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 @@ 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 -r 384283adcce1 -r 71761e9fb984 sat/plugins/plugin_misc_merge_requests.py --- a/sat/plugins/plugin_misc_merge_requests.py Thu Jul 16 09:07:20 2020 +0200 +++ b/sat/plugins/plugin_misc_merge_requests.py Thu Jul 16 09:07:26 2020 +0200 @@ -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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 -r 384283adcce1 -r 71761e9fb984 sat/plugins/plugin_misc_tickets.py --- a/sat/plugins/plugin_misc_tickets.py Thu Jul 16 09:07:20 2020 +0200 +++ b/sat/plugins/plugin_misc_tickets.py Thu Jul 16 09:07:26 2020 +0200 @@ -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 @@ "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 @@ 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 @@ 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 @@ 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 @@ 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 -r 384283adcce1 -r 71761e9fb984 sat_frontends/jp/cmd_merge_request.py --- a/sat_frontends/jp/cmd_merge_request.py Thu Jul 16 09:07:20 2020 +0200 +++ b/sat_frontends/jp/cmd_merge_request.py Thu Jul 16 09:07:26 2020 +0200 @@ -129,14 +129,16 @@ 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 @@ 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 -r 384283adcce1 -r 71761e9fb984 sat_frontends/jp/cmd_ticket.py --- a/sat_frontends/jp/cmd_ticket.py Thu Jul 16 09:07:20 2020 +0200 +++ b/sat_frontends/jp/cmd_ticket.py Thu Jul 16 09:07:26 2020 +0200 @@ -18,12 +18,13 @@ # along with this program. If not, see . -from . import base +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 -import json -import os +from . import base __commands__ = ["Ticket"] @@ -50,14 +51,17 @@ 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)