jp (pubsub/node): added subscriptions subcommand:

added subscriptions commands for node owner, with get/set subcommands (work in a similar way as affiliations)
This commit is contained in:
Goffi 2017-08-20 10:33:33 +02:00
commit 1d07c6bdd7

View file

@ -37,6 +37,7 @@ import sys
__commands__ = ["Pubsub"]
PUBSUB_TMP_DIR = u"pubsub"
ALLOWED_SUBSCRIPTIONS_OWNER = ('subscribed', 'pending', 'none')
# TODO: need to split this class in several modules, plugin should handle subcommands
@ -266,8 +267,103 @@ class NodeAffiliations(base.CommandBase):
super(NodeAffiliations, self).__init__(host, 'affiliations', use_profile=False, help=_(u'set or retrieve node affiliations'))
class NodeSubscriptionsGet(base.CommandBase):
def __init__(self, host):
base.CommandBase.__init__(self, host, 'get', use_output=C.OUTPUT_DICT, use_pubsub_node_req=True, help=_(u'retrieve node subscriptions (for node owner)'))
self.need_loop=True
def add_parser_options(self):
pass
def psNodeSubscriptionsGetCb(self, subscriptions):
self.output(subscriptions)
self.host.quit()
def psNodeSubscriptionsGetEb(self, failure_):
self.disp(u"can't get node subscriptions: {reason}".format(
reason=failure_), error=True)
self.host.quit(C.EXIT_BRIDGE_ERRBACK)
def start(self):
common.checkURI(self.args)
self.host.bridge.psNodeSubscriptionsGet(
self.args.service,
self.args.node,
self.profile,
callback=self.psNodeSubscriptionsGetCb,
errback=self.psNodeSubscriptionsGetEb)
class StoreSubscriptionAction(argparse.Action):
"""Action which handle subscription parameter for owner
list is given by pairs: jid and subscription state
if subscription state is not specified, it default to "subscribed"
"""
def __call__(self, parser, namespace, values, option_string):
dest_dict = getattr(namespace, self.dest)
while values:
jid_s = values.pop(0)
try:
subscription = values.pop(0)
except IndexError:
subscription = 'subscribed'
if subscription not in ALLOWED_SUBSCRIPTIONS_OWNER:
parser.error(_(u"subscription must be one of {}").format(u', '.join(ALLOWED_SUBSCRIPTIONS_OWNER)))
dest_dict[jid_s] = subscription
class NodeSubscriptionsSet(base.CommandBase):
def __init__(self, host):
base.CommandBase.__init__(self, host, 'set', use_pubsub_node_req=True, use_verbose=True, help=_(u'set/modify subscriptions (for node owner)'))
self.need_loop=True
def add_parser_options(self):
# XXX: we use optional argument syntax for a required one because list of list of 2 elements
# (uses to construct dicts) don't work with positional arguments
self.parser.add_argument("-S",
"--subscription",
dest="subscriptions",
default={},
nargs='+',
metavar=('JID [SUSBSCRIPTION]'),
required=True,
type=base.unicode_decoder,
action=StoreSubscriptionAction,
help=_(u"entity/subscription couple(s)"))
def psNodeSubscriptionsSetCb(self):
self.disp(_(u"subscriptions have been set"), 1)
self.host.quit()
def psNodeSubscriptionsSetEb(self, failure_):
self.disp(u"can't set node subscriptions: {reason}".format(
reason=failure_), error=True)
self.host.quit(C.EXIT_BRIDGE_ERRBACK)
def start(self):
common.checkURI(self.args)
self.host.bridge.psNodeSubscriptionsSet(
self.args.service,
self.args.node,
self.args.subscriptions,
self.profile,
callback=self.psNodeSubscriptionsSetCb,
errback=self.psNodeSubscriptionsSetEb)
class NodeSubscriptions(base.CommandBase):
subcommands = (NodeSubscriptionsGet, NodeSubscriptionsSet)
def __init__(self, host):
super(NodeSubscriptions, self).__init__(host, 'subscriptions', use_profile=False, help=_(u'get or modify node subscriptions'))
class Node(base.CommandBase):
subcommands = (NodeInfo, NodeCreate, NodeDelete, NodeSet, NodeAffiliations)
subcommands = (NodeInfo, NodeCreate, NodeDelete, NodeSet, NodeAffiliations, NodeSubscriptions)
def __init__(self, host):
super(Node, self).__init__(host, 'node', use_profile=False, help=_('node handling'))