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:
parent
7e826f6aae
commit
1d07c6bdd7
1 changed files with 97 additions and 1 deletions
|
|
@ -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'))
|
||||
|
|
|
|||
Loading…
Reference in a new issue