diff frontends/src/jp/cmd_event.py @ 2244:9d49e66bdbf2

jp (event): creation/modification of main event + invitee commands are now in a "invitee" subcommand
author Goffi <goffi@goffi.org>
date Fri, 19 May 2017 12:45:26 +0200
parents 4b1873ce6b61
children 0f3bfe89999e
line wrap: on
line diff
--- 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'))