1.1 --- a/imip_manager.py Thu Feb 12 22:35:16 2015 +0100
1.2 +++ b/imip_manager.py Thu Feb 12 22:41:50 2015 +0100
1.3 @@ -320,12 +320,12 @@
1.4 def _get_uid(self, path_info):
1.5 return path_info.lstrip("/").split("/", 1)[0]
1.6
1.7 - def _get_object(self, uid):
1.8 - if self.objects.has_key(uid):
1.9 - return self.objects[uid]
1.10 + def _get_object(self, uid, recurrenceid=None):
1.11 + if self.objects.has_key((uid, recurrenceid)):
1.12 + return self.objects[(uid, recurrenceid)]
1.13
1.14 - fragment = uid and self.store.get_event(self.user, uid) or None
1.15 - obj = self.objects[uid] = fragment and Object(fragment)
1.16 + fragment = uid and self.store.get_event(self.user, uid, recurrenceid) or None
1.17 + obj = self.objects[(uid, recurrenceid)] = fragment and Object(fragment)
1.18 return obj
1.19
1.20 def _get_requests(self):
1.21 @@ -337,11 +337,11 @@
1.22
1.23 def _get_request_summary(self):
1.24 summary = []
1.25 - for uid in self._get_requests():
1.26 - obj = self._get_object(uid)
1.27 + for uid, recurrenceid in self._get_requests():
1.28 + obj = self._get_object(uid, recurrenceid)
1.29 if obj:
1.30 for start, end in obj.get_periods_for_freebusy(self.get_tzid()):
1.31 - summary.append((start, end, uid))
1.32 + summary.append((start, end, uid, obj.get_value("TRANSP"), recurrenceid))
1.33 return summary
1.34
1.35 # Preference methods.
1.36 @@ -369,21 +369,21 @@
1.37
1.38 # Data management methods.
1.39
1.40 - def remove_request(self, uid):
1.41 - return self.store.dequeue_request(self.user, uid)
1.42 + def remove_request(self, uid, recurrenceid=None):
1.43 + return self.store.dequeue_request(self.user, uid, recurrenceid)
1.44
1.45 - def remove_event(self, uid):
1.46 - return self.store.remove_event(self.user, uid)
1.47 + def remove_event(self, uid, recurrenceid=None):
1.48 + return self.store.remove_event(self.user, uid, recurrenceid)
1.49
1.50 - def update_freebusy(self, uid, obj):
1.51 + def update_freebusy(self, uid, recurrenceid, obj):
1.52 tzid = self.get_tzid()
1.53 freebusy = self.store.get_freebusy(self.user)
1.54 update_freebusy(freebusy, self.user, obj.get_periods_for_freebusy(tzid),
1.55 - obj.get_value("TRANSP"), uid, self.store)
1.56 + obj.get_value("TRANSP"), uid, recurrenceid, self.store)
1.57
1.58 - def remove_from_freebusy(self, uid):
1.59 + def remove_from_freebusy(self, uid, recurrenceid=None):
1.60 freebusy = self.store.get_freebusy(self.user)
1.61 - remove_from_freebusy(freebusy, self.user, uid, self.store)
1.62 + remove_from_freebusy(freebusy, self.user, uid, recurrenceid, self.store)
1.63
1.64 # Presentation methods.
1.65
1.66 @@ -509,9 +509,9 @@
1.67 participant = get_uri(participant)
1.68 rwrite(("ATTENDEE", {"RSVP" : "TRUE", "PARTSTAT" : "NEEDS-ACTION"}, participant))
1.69
1.70 - obj = ("VEVENT", {}, record)
1.71 + node = ("VEVENT", {}, record)
1.72
1.73 - self.store.set_event(self.user, this_uid, obj)
1.74 + self.store.set_event(self.user, this_uid, node=node)
1.75 self.store.queue_request(self.user, this_uid)
1.76
1.77 # Redirect to the object (or the first of the objects), where instead of
1.78 @@ -626,8 +626,8 @@
1.79 # Save single user events.
1.80
1.81 elif save:
1.82 - self.store.set_event(self.user, uid, obj.to_node())
1.83 - self.update_freebusy(uid, obj)
1.84 + self.store.set_event(self.user, uid, node=obj.to_node())
1.85 + self.update_freebusy(uid, None, obj=obj)
1.86 self.remove_request(uid)
1.87
1.88 # Remove the request and the object.
1.89 @@ -707,7 +707,7 @@
1.90 attendees = uri_values((obj.get_values("ATTENDEE") or []) + args.get("attendee", []))
1.91 is_attendee = self.user in attendees
1.92
1.93 - is_request = obj.get_value("UID") in self._get_requests()
1.94 + is_request = (obj.get_value("UID"), obj.get_value("RECURRENCE-ID")) in self._get_requests()
1.95
1.96 have_other_attendees = len(attendees) > (is_attendee and 1 or 0)
1.97
1.98 @@ -1088,7 +1088,7 @@
1.99 page.tbody()
1.100
1.101 for t in conflicts:
1.102 - start, end, found_uid = t[:3]
1.103 + start, end, found_uid, transp, found_recurrenceid = t[:5]
1.104
1.105 # Provide details of any conflicting event.
1.106
1.107 @@ -1101,7 +1101,7 @@
1.108
1.109 page.td()
1.110
1.111 - found_obj = self._get_object(found_uid)
1.112 + found_obj = self._get_object(found_uid, found_recurrenceid)
1.113 if found_obj:
1.114 page.a(found_obj.get_value("SUMMARY"), href=self.env.new_url(found_uid))
1.115 else:
1.116 @@ -1133,11 +1133,11 @@
1.117
1.118 self.page.ul()
1.119
1.120 - for request in requests:
1.121 - obj = self._get_object(request)
1.122 + for uid, recurrenceid in requests:
1.123 + obj = self._get_object(uid, recurrenceid)
1.124 if obj:
1.125 self.page.li()
1.126 - self.page.a(obj.get_value("SUMMARY"), href="#request-%s" % request)
1.127 + self.page.a(obj.get_value("SUMMARY"), href="#request-%s-%s" % (uid, recurrenceid or ""))
1.128 self.page.li.close()
1.129
1.130 self.page.ul.close()
1.131 @@ -1197,7 +1197,7 @@
1.132 "Show an object request using the given 'path_info' for the current user."
1.133
1.134 uid = self._get_uid(path_info)
1.135 - obj = self._get_object(uid)
1.136 + obj = self._get_object(uid, None)
1.137
1.138 if not obj:
1.139 return False
1.140 @@ -1559,7 +1559,7 @@
1.141 page.td.close()
1.142 empty = 0
1.143
1.144 - start, end, uid, key = get_freebusy_details(t)
1.145 + start, end, uid, recurrenceid, key = get_freebusy_details(t)
1.146 span = spans[key]
1.147
1.148 # Produce a table cell only at the start of the period
1.149 @@ -1567,7 +1567,7 @@
1.150
1.151 if point == start or continuation:
1.152
1.153 - obj = self._get_object(uid)
1.154 + obj = self._get_object(uid, recurrenceid)
1.155
1.156 has_continued = continuation and point != start
1.157 will_continue = not ends_on_same_day(point, end, tzid)
1.158 @@ -1581,9 +1581,11 @@
1.159 )
1.160
1.161 # Only anchor the first cell of events.
1.162 + # NOTE: Need to only anchor the first period for a
1.163 + # NOTE: recurring event.
1.164
1.165 if point == start:
1.166 - page.td(class_=css, rowspan=span, id="%s-%s" % (group_type, uid))
1.167 + page.td(class_=css, rowspan=span, id="%s-%s-%s" % (group_type, uid, recurrenceid or ""))
1.168 else:
1.169 page.td(class_=css, rowspan=span)
1.170
1.171 @@ -1595,7 +1597,7 @@
1.172 # Only link to events if they are not being
1.173 # updated by requests.
1.174
1.175 - if uid in self._get_requests() and group_type != "request":
1.176 + if (uid, recurrenceid) in self._get_requests() and group_type != "request":
1.177 page.span(summary)
1.178 else:
1.179 href = "%s/%s" % (self.env.get_url().rstrip("/"), uid)