jp (event/invitee): added list command to get R.S.V.P. :
RSVP are gotten for invitees node, and R.S.V.P. are displayed. Then a summary display the number of yes, maybe and no, and the expected number of guests.
This commit is contained in:
parent
40220c3d7d
commit
eaa420fb03
2 changed files with 122 additions and 2 deletions
|
|
@ -20,6 +20,7 @@
|
|||
|
||||
import base
|
||||
from sat.core.i18n import _
|
||||
from sat.tools.common.ansi import ANSI as A
|
||||
from sat_frontends.jp.constants import Const as C
|
||||
from sat_frontends.jp import common
|
||||
from functools import partial
|
||||
|
|
@ -29,6 +30,8 @@ import time
|
|||
|
||||
__commands__ = ["Event"]
|
||||
|
||||
OUTPUT_OPT_TABLE = u'table'
|
||||
|
||||
# TODO: move date parsing to base, it may be useful for other commands
|
||||
|
||||
|
||||
|
|
@ -198,6 +201,123 @@ class InviteeSet(base.CommandBase):
|
|||
exit_code=C.EXIT_BRIDGE_ERRBACK))
|
||||
|
||||
|
||||
class InviteesList(base.CommandBase):
|
||||
|
||||
def __init__(self, host):
|
||||
extra_outputs = {'default': self.default_output}
|
||||
base.CommandBase.__init__(self,
|
||||
host,
|
||||
'list',
|
||||
use_output=C.OUTPUT_DICT_DICT,
|
||||
extra_outputs=extra_outputs,
|
||||
use_pubsub_node_req=True,
|
||||
use_verbose=True,
|
||||
help=_(u'get event attendance'))
|
||||
self.need_loop=True
|
||||
|
||||
def add_parser_options(self):
|
||||
pass
|
||||
|
||||
def _attend_filter(self, attend):
|
||||
if attend == u'yes':
|
||||
attend_color = C.A_SUCCESS
|
||||
elif attend == u'no':
|
||||
attend_color = C.A_FAILURE
|
||||
else:
|
||||
attend_color = A.FG_WHITE
|
||||
return A.color(attend_color, attend)
|
||||
|
||||
def _guests_filter(self, guests):
|
||||
return u'(' + guests + ')' if guests else u''
|
||||
|
||||
def default_output(self, event_data):
|
||||
data = []
|
||||
attendees_yes = 0
|
||||
attendees_maybe = 0
|
||||
attendees_no = 0
|
||||
guests = 0
|
||||
guests_maybe = 0
|
||||
for jid_, jid_data in event_data.iteritems():
|
||||
jid_data[u'jid'] = jid_
|
||||
try:
|
||||
guests_int = int(jid_data['guests'])
|
||||
except (ValueError, KeyError):
|
||||
pass
|
||||
if jid_data[u'attend'] == 'yes':
|
||||
attendees_yes += 1
|
||||
guests += guests_int
|
||||
elif jid_data[u'attend'] == 'maybe':
|
||||
attendees_maybe += 1
|
||||
guests_maybe += guests_int
|
||||
elif jid_data[u'attend'] == 'no':
|
||||
attendees_no += 1
|
||||
jid_data[u'guests'] = ''
|
||||
data.append(jid_data)
|
||||
|
||||
show_table = OUTPUT_OPT_TABLE in self.args.output_opts
|
||||
|
||||
table = common.Table.fromDict(self.host,
|
||||
data,
|
||||
(u'nick',) + ((u'jid',) if self.host.verbosity else ()) + (u'attend', 'guests'),
|
||||
headers=None,
|
||||
filters = { u'nick': A.color(C.A_HEADER, u'{} '),
|
||||
u'jid': u'{} ',
|
||||
u'attend': self._attend_filter,
|
||||
u'guests': u'{}' if show_table else self._guests_filter,
|
||||
},
|
||||
defaults = { u'nick': u'',
|
||||
u'attend': u'',
|
||||
u'guests': 1
|
||||
}
|
||||
)
|
||||
if show_table:
|
||||
table.display()
|
||||
else:
|
||||
table.display_blank(show_header=False, col_sep=u'')
|
||||
|
||||
self.disp(u'')
|
||||
self.disp(A.color(
|
||||
C.A_SUBHEADER,
|
||||
_(u'Attendees: '),
|
||||
A.RESET,
|
||||
unicode(len(data)),
|
||||
_(u' ('),
|
||||
C.A_SUCCESS,
|
||||
_(u'yes: '),
|
||||
unicode(attendees_yes),
|
||||
A.FG_WHITE,
|
||||
_(u', maybe: '),
|
||||
unicode(attendees_maybe),
|
||||
u', ',
|
||||
C.A_FAILURE,
|
||||
_(u'no: '),
|
||||
unicode(attendees_no),
|
||||
A.RESET,
|
||||
u')'
|
||||
))
|
||||
self.disp(A.color(C.A_SUBHEADER, _(u'confirmed guests: '), A.RESET, unicode(guests)))
|
||||
self.disp(A.color(C.A_SUBHEADER, _(u'unconfirmed guests: '), A.RESET, unicode(guests_maybe)))
|
||||
self.disp(A.color(C.A_SUBHEADER, _(u'total: '), A.RESET, unicode(guests+guests_maybe)))
|
||||
|
||||
def eventInviteesListCb(self, event_data):
|
||||
for jid_, data in event_data.iteritems():
|
||||
id_data = self.host.bridge.identityGet(jid_, self.profile)
|
||||
data[u'nick'] = id_data.get(u'nick', u'')
|
||||
self.output(event_data)
|
||||
self.host.quit()
|
||||
|
||||
def start(self):
|
||||
common.checkURI(self.args)
|
||||
self.host.bridge.eventInviteesList(
|
||||
self.args.service,
|
||||
self.args.node,
|
||||
self.profile,
|
||||
callback=self.eventInviteesListCb,
|
||||
errback=partial(self.errback,
|
||||
msg=_(u"can't get event data: {}"),
|
||||
exit_code=C.EXIT_BRIDGE_ERRBACK))
|
||||
|
||||
|
||||
class InviteeInvite(base.CommandBase):
|
||||
|
||||
def __init__(self, host):
|
||||
|
|
@ -239,7 +359,7 @@ class InviteeInvite(base.CommandBase):
|
|||
|
||||
|
||||
class Invitee(base.CommandBase):
|
||||
subcommands = (InviteeGet, InviteeSet, InviteeInvite)
|
||||
subcommands = (InviteeGet, InviteeSet, InviteesList, InviteeInvite)
|
||||
|
||||
def __init__(self, host):
|
||||
super(Invitee, self).__init__(host, 'invitee', use_profile=False, help=_(u'manage invities'))
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
""" Objects handling bridge data, with jinja2 safe markup handling"""
|
||||
"""Objects handling bridge data, with jinja2 safe markup handling"""
|
||||
|
||||
from sat.tools.common import data_format
|
||||
try:
|
||||
|
|
|
|||
Loading…
Reference in a new issue