# HG changeset patch # User Goffi # Date 1495190726 -7200 # Node ID 9d49e66bdbf257037ab41f795c20ce186c474a09 # Parent 5e12fc5ae52a63ac89692060827a9f563bf97f64 jp (event): creation/modification of main event + invitee commands are now in a "invitee" subcommand diff -r 5e12fc5ae52a -r 9d49e66bdbf2 frontends/src/jp/cmd_event.py --- a/frontends/src/jp/cmd_event.py Fri May 19 12:43:41 2017 +0200 +++ b/frontends/src/jp/cmd_event.py Fri May 19 12:45:26 2017 +0200 @@ -22,9 +22,14 @@ from sat.core.i18n import _ from sat_frontends.jp.constants import Const as C from functools import partial +from dateutil import parser as du_parser +import calendar +import time __commands__ = ["Event"] +# TODO: move date parsing to base, it may be useful for other commands + class Get(base.CommandBase): @@ -35,30 +40,140 @@ use_output=C.OUTPUT_DICT, use_pubsub_node_req=True, use_verbose=True, + help=_(u'get event data')) + self.need_loop=True + + def add_parser_options(self): + self.parser.add_argument("-i", "--id", type=base.unicode_decoder, default=u'', help=_(u"ID of the PubSub Item")) + + def eventInviteeGetCb(self, result): + event_date, event_data = result + event_data['date'] = event_date + self.output(event_data) + self.host.quit() + + def start(self): + self.host.bridge.eventGet( + self.args.service, + self.args.node, + self.args.id, + self.profile, + callback=self.eventInviteeGetCb, + errback=partial(self.errback, + msg=_(u"can't get event data: {}"), + exit_code=C.EXIT_BRIDGE_ERRBACK)) + + +class EventBase(object): + + def add_parser_options(self): + self.parser.add_argument("-i", "--id", type=base.unicode_decoder, default=u'', help=_(u"ID of the PubSub Item")) + self.parser.add_argument("-d", "--date", type=unicode, help=_(u"date of the event")) + self.parser.add_argument("-f", "--field", type=base.unicode_decoder, action='append', nargs=2, dest='fields', + metavar=(u"KEY", u"VALUE"), help=_(u"configuration field to set")) + + def parseFields(self): + return dict(self.args.fields) if self.args.fields else {} + + def parseDate(self): + if self.args.date: + try: + date = int(self.args.date) + except ValueError: + try: + date_time = du_parser.parse(self.args.date, dayfirst=True) + except ValueError as e: + self.parser.error(_(u"Can't parse date: {msg}").format(msg=e)) + if date_time.tzinfo is None: + date = calendar.timegm(date_time.timetuple()) + else: + date = time.mktime(date_time.timetuple()) + else: + date = -1 + return date + + +class Create(EventBase, base.CommandBase): + def __init__(self, host): + super(Create, self).__init__(host, 'create', use_pubsub_node_req=True, help=_('create or replace event')) + EventBase.__init__(self) + self.need_loop=True + + def eventCreateCb(self, node): + self.disp(_(u'Event created successfuly on node {node}').format(node=node)) + self.host.quit() + + def start(self): + fields = self.parseFields() + date = self.parseDate() + self.host.bridge.eventCreate( + date, + fields, + self.args.service, + self.args.node, + self.args.id, + self.profile, + callback=self.eventCreateCb, + errback=partial(self.errback, + msg=_(u"can't create event: {}"), + exit_code=C.EXIT_BRIDGE_ERRBACK)) + + +class Modify(EventBase, base.CommandBase): + def __init__(self, host): + super(Modify, self).__init__(host, 'modify', use_pubsub_node_req=True, help=_('modify an existing event')) + EventBase.__init__(self) + self.need_loop=True + + def start(self): + fields = self.parseFields() + date = 0 if not self.args.date else self.parseDate() + self.host.bridge.eventModify( + self.args.service, + self.args.node, + self.args.id, + date, + fields, + self.profile, + callback=self.host.quit, + errback=partial(self.errback, + msg=_(u"can't update event data: {}"), + exit_code=C.EXIT_BRIDGE_ERRBACK)) + + +class InviteeGet(base.CommandBase): + + def __init__(self, host): + base.CommandBase.__init__(self, + host, + 'get', + use_output=C.OUTPUT_DICT, + use_pubsub_node_req=True, + use_verbose=True, help=_(u'get event attendance')) self.need_loop=True def add_parser_options(self): pass - def eventGetCb(self, event_data): + def eventInviteeGetCb(self, event_data): self.output(event_data) self.host.quit() def start(self): - self.host.bridge.eventGet( + self.host.bridge.eventInviteeGet( self.args.service, self.args.node, self.profile, - callback=self.eventGetCb, + callback=self.eventInviteeGetCb, errback=partial(self.errback, msg=_(u"can't get event data: {}"), exit_code=C.EXIT_BRIDGE_ERRBACK)) -class Set(base.CommandBase): +class InviteeSet(base.CommandBase): def __init__(self, host): - super(Set, self).__init__(host, 'set', use_output=C.OUTPUT_DICT, use_pubsub_node_req=True, help=_('set event attendance')) + super(InviteeSet, self).__init__(host, 'set', use_output=C.OUTPUT_DICT, use_pubsub_node_req=True, help=_('set event attendance')) self.need_loop=True def add_parser_options(self): @@ -67,7 +182,7 @@ def start(self): fields = dict(self.args.fields) if self.args.fields else {} - self.host.bridge.eventSet( + self.host.bridge.eventInviteeSet( self.args.service, self.args.node, fields, @@ -78,8 +193,15 @@ exit_code=C.EXIT_BRIDGE_ERRBACK)) +class Invitee(base.CommandBase): + subcommands = (InviteeGet, InviteeSet) + + def __init__(self, host): + super(Invitee, self).__init__(host, 'invitee', use_profile=False, help=_(u'manage invities')) + + class Event(base.CommandBase): - subcommands = (Get, Set) + subcommands = (Get, Create, Modify, Invitee) def __init__(self, host): super(Event, self).__init__(host, 'event', use_profile=False, help=_('event management'))