Mercurial > libervia-backend
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): |