1.1 --- a/imipweb/event.py Mon Oct 05 23:53:38 2015 +0200
1.2 +++ b/imipweb/event.py Mon Oct 05 23:56:48 2015 +0200
1.3 @@ -534,6 +534,8 @@
1.4 if not attendees:
1.5 return
1.6
1.7 + attendees = self.get_verbose_attendees(attendees)
1.8 +
1.9 page.p("The following counter-proposals have been received for this event:")
1.10
1.11 page.table(cellspacing=5, cellpadding=5, class_="counters")
1.12 @@ -549,8 +551,9 @@
1.13 page.thead.close()
1.14 page.tbody()
1.15
1.16 - for attendee in attendees:
1.17 - obj = self.get_stored_object(self.uid, self.recurrenceid, "counters", attendee)
1.18 + for i, attendee in enumerate(attendees):
1.19 + attendee_uri = get_uri(attendee)
1.20 + obj = self.get_stored_object(self.uid, self.recurrenceid, "counters", attendee_uri)
1.21 periods = self.get_periods(obj)
1.22
1.23 first = True
1.24 @@ -562,7 +565,6 @@
1.25
1.26 if first:
1.27 page.td(attendee, rowspan=len(periods))
1.28 - first = False
1.29
1.30 start = self.format_datetime(to_timezone(p.get_start(), tzid), "long")
1.31 end = self.format_datetime(to_timezone(p.get_end(), tzid), "long")
1.32 @@ -570,7 +572,14 @@
1.33 page.td(start)
1.34 page.td(end)
1.35
1.36 + if first:
1.37 + page.td(rowspan=len(periods))
1.38 + self.control("decline-%d" % i, "submit", "Decline")
1.39 + self.control("decline", "hidden", attendee)
1.40 + page.td.close()
1.41 +
1.42 page.tr.close()
1.43 + first = False
1.44
1.45 page.tbody.close()
1.46 page.table.close()
1.47 @@ -705,6 +714,25 @@
1.48 cancel = args.has_key("cancel")
1.49 ignore = args.has_key("ignore")
1.50 save = args.has_key("save")
1.51 + decline = filter(None, [(arg.startswith("decline-") and arg[len("decline-"):]) for arg in args.keys()])
1.52 +
1.53 + # Decline a counter-proposal.
1.54 +
1.55 + if decline:
1.56 + for s in decline:
1.57 + try:
1.58 + i = int(s)
1.59 + except (IndexError, ValueError):
1.60 + pass
1.61 + else:
1.62 + attendee_uri = get_uri(args.get("decline", [])[i])
1.63 + self.process_declined_counter(attendee_uri)
1.64 +
1.65 + # Update the counter-proposals synchronously instead of
1.66 + # assuming that the outgoing handler will have done so
1.67 + # before the form is refreshed.
1.68 +
1.69 + self.remove_counter(attendee_uri)
1.70
1.71 have_action = reply or discard or create or cancel or ignore or save
1.72
1.73 @@ -923,9 +951,22 @@
1.74
1.75 def get_attendees_from_page(self):
1.76
1.77 - "Return attendees from the request."
1.78 + """
1.79 + Return attendees from the request, using any stored attributes to obtain
1.80 + verbose details.
1.81 + """
1.82 +
1.83 + return self.get_verbose_attendees(self.env.get_args().get("attendee", []))
1.84
1.85 - return self.env.get_args().get("attendee", [])
1.86 + def get_verbose_attendees(self, attendees):
1.87 +
1.88 + """
1.89 + Use any stored attributes to obtain verbose details for the given
1.90 + 'attendees'.
1.91 + """
1.92 +
1.93 + attendee_map = self.obj.get_value_map("ATTENDEE")
1.94 + return [get_verbose_address(value, attendee_map.get(value)) for value in attendees]
1.95
1.96 def update_attendees_from_page(self):
1.97