# HG changeset patch # User Goffi # Date 1614447463 -3600 # Node ID cc065c13052c24283fe690c1eca3c535d03ffb33 # Parent e12e9e1535d37399fbc08573bbc4d228d3a70c5e plugin XEP-0346: new `psSchemaDictGet` to get node schema as a serialisable dict diff -r e12e9e1535d3 -r cc065c13052c sat/plugins/plugin_xep_0346.py --- a/sat/plugins/plugin_xep_0346.py Sat Feb 27 18:36:38 2021 +0100 +++ b/sat/plugins/plugin_xep_0346.py Sat Feb 27 18:37:43 2021 +0100 @@ -18,6 +18,7 @@ from collections import Iterable import itertools +from typing import Optional from zope.interface import implementer from twisted.words.protocols.jabber import jid from twisted.words.protocols.jabber.xmlstream import XMPPHandler @@ -29,6 +30,7 @@ from sat.core.i18n import _ from sat.core import exceptions from sat.core.constants import Const as C +from sat.core.xmpp import SatXMPPEntity from sat.tools import xml_tools from sat.tools import utils from sat.tools.common import date_utils @@ -85,6 +87,14 @@ async_=True, ) host.bridge.addMethod( + "psSchemaDictGet", + ".plugin", + in_sign="sss", + out_sign="s", + method=self._getSchemaDict, + async_=True, + ) + host.bridge.addMethod( "psItemsFormGet", ".plugin", in_sign="ssssiassa{ss}s", @@ -247,6 +257,25 @@ await self._p.createIfNewNode(client, service, node_id, node_options) await self._p.sendItem(client, service, node_id, schema, self._p.ID_SINGLETON) + def _getSchemaDict(self, service, nodeIdentifier, profile): + service = None if not service else jid.JID(service) + client = self.host.getClient(profile) + d = defer.ensureDeferred(self.getSchemaDict(client, service, nodeIdentifier)) + d.addCallback(data_format.serialise) + return d + + async def getSchemaDict( + self, + client: SatXMPPEntity, + service: Optional[jid.JID], + nodeIdentifier: str) -> dict: + """Retrieve a node schema and format it a simple dictionary + + The dictionary is made so it can be easily serialisable + """ + schema_form = await self.getSchemaForm(client, service, nodeIdentifier) + return xml_tools.dataForm2dataDict(schema_form) + def _getDataFormItems(self, form_ns="", service="", node="", schema="", max_items=10, item_ids=None, sub_id=None, extra_dict=None, profile_key=C.PROF_KEY_NONE):