1.1 --- a/imipweb/calendar.py Tue Sep 29 19:28:40 2015 +0200
1.2 +++ b/imipweb/calendar.py Tue Sep 29 21:03:03 2015 +0200
1.3 @@ -20,7 +20,7 @@
1.4 """
1.5
1.6 from datetime import datetime
1.7 -from imiptools.data import get_address, get_uri, uri_values
1.8 +from imiptools.data import get_address, get_uri, uri_parts
1.9 from imiptools.dates import format_datetime, get_datetime, \
1.10 get_datetime_item, get_end_of_day, get_start_of_day, \
1.11 get_start_of_next_day, get_timestamp, ends_on_same_day, \
1.12 @@ -123,21 +123,29 @@
1.13 start, end = coalesced[0]
1.14 start_value, start_attr = get_datetime_item(start, tzid)
1.15 end_value, end_attr = get_datetime_item(end, tzid)
1.16 + user_attr = self.get_user_attributes()
1.17
1.18 rwrite(("UID", {}, uid))
1.19 rwrite(("SUMMARY", {}, summary or ("New event at %s" % utcnow)))
1.20 rwrite(("DTSTAMP", {}, utcnow))
1.21 rwrite(("DTSTART", start_attr, start_value))
1.22 rwrite(("DTEND", end_attr, end_value))
1.23 - rwrite(("ORGANIZER", {}, self.user))
1.24 + rwrite(("ORGANIZER", user_attr, self.user))
1.25 +
1.26 + cn_participants = uri_parts(filter(None, participants))
1.27 + participants = []
1.28
1.29 - participants = uri_values(filter(None, participants))
1.30 -
1.31 - for participant in participants:
1.32 - rwrite(("ATTENDEE", {"RSVP" : "TRUE", "PARTSTAT" : "NEEDS-ACTION"}, participant))
1.33 + for cn, participant in cn_participants:
1.34 + d = {"RSVP" : "TRUE", "PARTSTAT" : "NEEDS-ACTION"}
1.35 + if cn:
1.36 + d["CN"] = cn
1.37 + rwrite(("ATTENDEE", d, participant))
1.38 + participants.append(participant)
1.39
1.40 if self.user not in participants:
1.41 - rwrite(("ATTENDEE", {"PARTSTAT" : "ACCEPTED"}, self.user))
1.42 + d = {"PARTSTAT" : "ACCEPTED"}
1.43 + d.update(user_attr)
1.44 + rwrite(("ATTENDEE", d, self.user))
1.45
1.46 # Define additional occurrences if many slots are defined.
1.47
2.1 --- a/imipweb/event.py Tue Sep 29 19:28:40 2015 +0200
2.2 +++ b/imipweb/event.py Tue Sep 29 21:03:03 2015 +0200
2.3 @@ -19,7 +19,7 @@
2.4 this program. If not, see <http://www.gnu.org/licenses/>.
2.5 """
2.6
2.7 -from imiptools.data import get_uri, uri_dict, uri_items, uri_values
2.8 +from imiptools.data import get_uri, get_verbose_address, uri_dict, uri_items, uri_values
2.9 from imiptools.dates import format_datetime, to_timezone
2.10 from imiptools.mail import Messenger
2.11 from imiptools.period import have_conflict
2.12 @@ -101,7 +101,7 @@
2.13 return get_uri(self.obj.get_value("ORGANIZER")) == self.user
2.14
2.15 def get_stored_attendees(self):
2.16 - return uri_values(self.obj.get_values("ATTENDEE") or [])
2.17 + return [get_verbose_address(value, attr) for value, attr in self.obj.get_items("ATTENDEE") or []]
2.18
2.19 def get_stored_main_period(self):
2.20
2.21 @@ -140,7 +140,7 @@
2.22 page = self.page
2.23 args = self.env.get_args()
2.24
2.25 - attendees = self.get_current_attendees()
2.26 + attendees = uri_values(self.get_current_attendees())
2.27 is_attendee = self.user in attendees
2.28 is_request = self._have_request(self.uid, self.recurrenceid)
2.29
2.30 @@ -287,7 +287,7 @@
2.31
2.32 # Obtain details of attendees to supply attributes.
2.33
2.34 - self.show_attendee(i, value, attendee_map.get(value))
2.35 + self.show_attendee(i, value, attendee_map.get(get_uri(value)))
2.36 page.tr.close()
2.37
2.38 # Allow more attendees to be specified.
2.39 @@ -314,7 +314,10 @@
2.40 first = False
2.41
2.42 page.td(class_="objectvalue %s" % field)
2.43 - page.add(value)
2.44 + if name == "ORGANIZER":
2.45 + page.add(get_verbose_address(value, attr))
2.46 + else:
2.47 + page.add(value)
2.48 page.td.close()
2.49 page.tr.close()
2.50
2.51 @@ -338,13 +341,14 @@
2.52 page = self.page
2.53 args = self.env.get_args()
2.54
2.55 + attendee_uri = get_uri(attendee)
2.56 partstat = attendee_attr and attendee_attr.get("PARTSTAT")
2.57
2.58 page.td(class_="objectvalue")
2.59
2.60 # Show a form control as organiser for new attendees.
2.61
2.62 - if self.is_organiser() and self.can_edit_attendee(attendee):
2.63 + if self.is_organiser() and self.can_edit_attendee(attendee_uri):
2.64 self.control("attendee", "value", attendee, size="40")
2.65 else:
2.66 self.control("attendee", "hidden", attendee)
2.67 @@ -353,14 +357,14 @@
2.68
2.69 # Show participation status, editable for the current user.
2.70
2.71 - if attendee == self.user:
2.72 + if attendee_uri == self.user:
2.73 self.menu("partstat", partstat, self.partstat_items, "partstat")
2.74
2.75 # Allow the participation indicator to act as a submit
2.76 # button in order to refresh the page and show a control for
2.77 # the current user, if indicated.
2.78
2.79 - elif self.is_organiser() and self.attendee_is_new(attendee):
2.80 + elif self.is_organiser() and self.attendee_is_new(attendee_uri):
2.81 self.control("partstat-refresh", "submit", "refresh", id="partstat-%d" % i, class_="refresh")
2.82 page.label(dict(self.partstat_items).get(partstat, ""), for_="partstat-%s" % i, class_="partstat")
2.83
2.84 @@ -375,7 +379,7 @@
2.85
2.86 # Permit the removal of newly-added attendees.
2.87
2.88 - remove_type = self.can_remove_attendee(attendee) and "submit" or "checkbox"
2.89 + remove_type = self.can_remove_attendee(attendee_uri) and "submit" or "checkbox"
2.90 self.control("remove", remove_type, str(i), str(i) in args.get("remove", []), id="remove-%d" % i, class_="remove")
2.91
2.92 page.label("Remove", for_="remove-%d" % i, class_="remove")
2.93 @@ -751,7 +755,7 @@
2.94
2.95 # Obtain any participants and those to be removed.
2.96
2.97 - attendees = self.get_attendees_from_page()
2.98 + attendees = map(lambda s: s and get_uri(s), self.get_attendees_from_page())
2.99 removed = [attendees[int(i)] for i in args.get("remove", [])]
2.100 to_cancel = self.update_attendees(self.obj, attendees, removed)
2.101 single_user = not attendees or attendees == [self.user]
2.102 @@ -921,19 +925,9 @@
2.103
2.104 def get_attendees_from_page(self):
2.105
2.106 - """
2.107 - Return attendees from the request, normalised for iCalendar purposes.
2.108 - """
2.109 -
2.110 - args = self.env.get_args()
2.111 - attendees = []
2.112 + "Return attendees from the request."
2.113
2.114 - for attendee in args.get("attendee", []):
2.115 - if attendee.strip():
2.116 - attendee = get_uri(attendee)
2.117 - attendees.append(attendee)
2.118 -
2.119 - return attendees
2.120 + return self.env.get_args().get("attendee", [])
2.121
2.122 def update_attendees_from_page(self):
2.123