comparison frontends/src/jp/cmd_event.py @ 2321:c2a9da96e40b

jp (event/attendee/list): added --missing to show missing people (ones who didn't replied) and --no-rsvp to hide ones who answered
author Goffi <goffi@goffi.org>
date Sun, 09 Jul 2017 16:17:16 +0200
parents 137ed5fbcbfd
children 8b37a62336c3
comparison
equal deleted inserted replaced
2320:f4a0723042ee 2321:c2a9da96e40b
214 use_verbose=True, 214 use_verbose=True,
215 help=_(u'get event attendance')) 215 help=_(u'get event attendance'))
216 self.need_loop=True 216 self.need_loop=True
217 217
218 def add_parser_options(self): 218 def add_parser_options(self):
219 pass 219 self.parser.add_argument('-m', '--missing', action='store_true', help=_(u'show missing people (invited but no R.S.V.P. so far)'))
220 self.parser.add_argument('-R', '--no-rsvp', action='store_true', help=_(u"don't show people which gave R.S.V.P."))
220 221
221 def _attend_filter(self, attend): 222 def _attend_filter(self, attend):
222 if attend == u'yes': 223 if attend == u'yes':
223 attend_color = C.A_SUCCESS 224 attend_color = C.A_SUCCESS
224 elif attend == u'no': 225 elif attend == u'no':
226 else: 227 else:
227 attend_color = A.FG_WHITE 228 attend_color = A.FG_WHITE
228 return A.color(attend_color, attend) 229 return A.color(attend_color, attend)
229 230
230 def _guests_filter(self, guests): 231 def _guests_filter(self, guests):
231 return u'(' + guests + ')' if guests else u'' 232 return u'(' + unicode(guests) + ')' if guests else u''
232 233
233 def default_output(self, event_data): 234 def default_output(self, event_data):
234 data = [] 235 data = []
235 attendees_yes = 0 236 attendees_yes = 0
236 attendees_maybe = 0 237 attendees_maybe = 0
237 attendees_no = 0 238 attendees_no = 0
239 attendees_missing = 0
238 guests = 0 240 guests = 0
239 guests_maybe = 0 241 guests_maybe = 0
240 for jid_, jid_data in event_data.iteritems(): 242 for jid_, jid_data in event_data.iteritems():
241 jid_data[u'jid'] = jid_ 243 jid_data[u'jid'] = jid_
242 try: 244 try:
243 guests_int = int(jid_data['guests']) 245 guests_int = int(jid_data['guests'])
244 except (ValueError, KeyError): 246 except (ValueError, KeyError):
245 pass 247 pass
246 if jid_data[u'attend'] == 'yes': 248 attend = jid_data.get(u'attend',u'')
249 if attend == 'yes':
247 attendees_yes += 1 250 attendees_yes += 1
248 guests += guests_int 251 guests += guests_int
249 elif jid_data[u'attend'] == 'maybe': 252 elif attend == 'maybe':
250 attendees_maybe += 1 253 attendees_maybe += 1
251 guests_maybe += guests_int 254 guests_maybe += guests_int
252 elif jid_data[u'attend'] == 'no': 255 elif attend == 'no':
253 attendees_no += 1 256 attendees_no += 1
257 jid_data[u'guests'] = ''
258 else:
259 attendees_missing += 1
254 jid_data[u'guests'] = '' 260 jid_data[u'guests'] = ''
255 data.append(jid_data) 261 data.append(jid_data)
256 262
257 show_table = OUTPUT_OPT_TABLE in self.args.output_opts 263 show_table = OUTPUT_OPT_TABLE in self.args.output_opts
258 264
273 if show_table: 279 if show_table:
274 table.display() 280 table.display()
275 else: 281 else:
276 table.display_blank(show_header=False, col_sep=u'') 282 table.display_blank(show_header=False, col_sep=u'')
277 283
278 self.disp(u'') 284 if not self.args.no_rsvp:
279 self.disp(A.color( 285 self.disp(u'')
280 C.A_SUBHEADER, 286 self.disp(A.color(
281 _(u'Attendees: '), 287 C.A_SUBHEADER,
282 A.RESET, 288 _(u'Attendees: '),
283 unicode(len(data)), 289 A.RESET,
284 _(u' ('), 290 unicode(len(data)),
285 C.A_SUCCESS, 291 _(u' ('),
286 _(u'yes: '), 292 C.A_SUCCESS,
287 unicode(attendees_yes), 293 _(u'yes: '),
288 A.FG_WHITE, 294 unicode(attendees_yes),
289 _(u', maybe: '), 295 A.FG_WHITE,
290 unicode(attendees_maybe), 296 _(u', maybe: '),
291 u', ', 297 unicode(attendees_maybe),
292 C.A_FAILURE, 298 u', ',
293 _(u'no: '), 299 C.A_FAILURE,
294 unicode(attendees_no), 300 _(u'no: '),
295 A.RESET, 301 unicode(attendees_no),
296 u')' 302 A.RESET,
297 )) 303 u')'
298 self.disp(A.color(C.A_SUBHEADER, _(u'confirmed guests: '), A.RESET, unicode(guests))) 304 ))
299 self.disp(A.color(C.A_SUBHEADER, _(u'unconfirmed guests: '), A.RESET, unicode(guests_maybe))) 305 self.disp(A.color(C.A_SUBHEADER, _(u'confirmed guests: '), A.RESET, unicode(guests)))
300 self.disp(A.color(C.A_SUBHEADER, _(u'total: '), A.RESET, unicode(guests+guests_maybe))) 306 self.disp(A.color(C.A_SUBHEADER, _(u'unconfirmed guests: '), A.RESET, unicode(guests_maybe)))
301 307 self.disp(A.color(C.A_SUBHEADER, _(u'total: '), A.RESET, unicode(guests+guests_maybe)))
302 def eventInviteesListCb(self, event_data): 308 if attendees_missing:
303 for jid_, data in event_data.iteritems(): 309 self.disp('')
310 self.disp(A.color(C.A_SUBHEADER, _(u'missing people (no reply): '), A.RESET, unicode(attendees_missing)))
311
312 def eventInviteesListCb(self, event_data, prefilled_data):
313 """fill nicknames and keep only requested people
314
315 @param event_data(dict): R.S.V.P. answers
316 @param prefilled_data(dict): prefilled data with all people
317 only filled if --missing is used
318 """
319 if self.args.no_rsvp:
320 for jid_ in event_data:
321 # if there is a jid in event_data
322 # it must be there in prefilled_data too
323 # so no need to check for KeyError
324 del prefilled_data[jid_]
325 else:
326 # we replace empty dicts for existing people with R.S.V.P. data
327 prefilled_data.update(event_data)
328
329 # we get nicknames for everybody, make it easier for organisers
330 for jid_, data in prefilled_data.iteritems():
304 id_data = self.host.bridge.identityGet(jid_, self.profile) 331 id_data = self.host.bridge.identityGet(jid_, self.profile)
305 data[u'nick'] = id_data.get(u'nick', u'') 332 data[u'nick'] = id_data.get(u'nick', u'')
306 self.output(event_data) 333
334 self.output(prefilled_data)
307 self.host.quit() 335 self.host.quit()
308 336
309 def start(self): 337 def getList(self, prefilled_data={}):
310 common.checkURI(self.args)
311 self.host.bridge.eventInviteesList( 338 self.host.bridge.eventInviteesList(
312 self.args.service, 339 self.args.service,
313 self.args.node, 340 self.args.node,
314 self.profile, 341 self.profile,
315 callback=self.eventInviteesListCb, 342 callback=partial(self.eventInviteesListCb,
343 prefilled_data=prefilled_data),
316 errback=partial(self.errback, 344 errback=partial(self.errback,
317 msg=_(u"can't get event data: {}"), 345 msg=_(u"can't get event data: {}"),
318 exit_code=C.EXIT_BRIDGE_ERRBACK)) 346 exit_code=C.EXIT_BRIDGE_ERRBACK))
347
348 def psNodeAffiliationsGetCb(self, affiliations):
349 # we fill all affiliations with empty data
350 # answered one will be filled in eventInviteesListCb
351 # we only consider people with "publisher" affiliation as invited, creators are not, and members can just observe
352 prefilled = {jid_: {} for jid_, affiliation in affiliations.iteritems() if affiliation in (u'publisher',)}
353 self.getList(prefilled)
354
355 def start(self):
356 if self.args.no_rsvp and not self.args.missing:
357 self.parser.error(_(u"you need to use --missing if you use --no-rsvp"))
358 common.checkURI(self.args)
359 if self.args.missing:
360 self.host.bridge.psNodeAffiliationsGet(
361 self.args.service,
362 self.args.node,
363 self.profile,
364 callback=self.psNodeAffiliationsGetCb,
365 errback=partial(self.errback,
366 msg=_(u"can't get event data: {}"),
367 exit_code=C.EXIT_BRIDGE_ERRBACK))
368 else:
369 self.getList()
319 370
320 371
321 class InviteeInvite(base.CommandBase): 372 class InviteeInvite(base.CommandBase):
322 373
323 def __init__(self, host): 374 def __init__(self, host):