1.1 --- a/imipweb/event.py Sat Apr 04 22:33:42 2015 +0200
1.2 +++ b/imipweb/event.py Sat Apr 04 22:43:31 2015 +0200
1.3 @@ -125,7 +125,7 @@
1.4
1.5 # Obtain any participants and those to be removed.
1.6
1.7 - attendees = args.get("attendee")
1.8 + attendees = self.get_attendees()
1.9 removed = args.get("remove")
1.10 to_cancel = update_attendees(obj, attendees, removed)
1.11
1.12 @@ -407,13 +407,34 @@
1.13 dtend, dtend_attr = dtstart, dtstart_attr
1.14 return (dtstart, dtstart_attr), (dtend, dtend_attr)
1.15
1.16 - def get_attendees(self, obj):
1.17 + def get_attendees(self):
1.18 +
1.19 + """
1.20 + Return attendees from the request, normalised for iCalendar purposes,
1.21 + and without duplicates.
1.22 + """
1.23 +
1.24 + args = self.env.get_args()
1.25 +
1.26 + attendees = args.get("attendee", [])
1.27 + unique_attendees = set()
1.28 + ordered_attendees = []
1.29 +
1.30 + for attendee in attendees:
1.31 + attendee = get_uri(attendee)
1.32 + if attendee not in unique_attendees:
1.33 + unique_attendees.add(attendee)
1.34 + ordered_attendees.append(attendee)
1.35 +
1.36 + return ordered_attendees
1.37 +
1.38 + def update_attendees(self, obj):
1.39
1.40 "Add or remove attendees. This does not affect the stored object."
1.41
1.42 args = self.env.get_args()
1.43
1.44 - attendees = args.get("attendee", [])
1.45 + attendees = self.get_attendees()
1.46
1.47 if args.has_key("add"):
1.48 attendees.append("")
1.49 @@ -503,7 +524,7 @@
1.50 initial_load = not args.has_key("editing")
1.51
1.52 existing_attendees = uri_values(obj.get_values("ATTENDEE") or [])
1.53 - attendees = is_organiser and self.get_attendees(obj) or \
1.54 + attendees = is_organiser and self.update_attendees(obj) or \
1.55 (initial_load or not is_organiser) and existing_attendees or []
1.56
1.57 (dtstart, dtstart_attr), (dtend, dtend_attr) = self.get_event_period(obj)