1.1 --- a/imip_store.py Thu Feb 12 17:31:22 2015 +0100
1.2 +++ b/imip_store.py Thu Feb 12 17:44:01 2015 +0100
1.3 @@ -128,6 +128,52 @@
1.4
1.5 return self._remove_object(filename)
1.6
1.7 + def get_recurrences(self, user, uid):
1.8 +
1.9 + """
1.10 + Get additional event instances for an event of the given 'user' with the
1.11 + indicated 'uid'.
1.12 + """
1.13 +
1.14 + filename = self.get_object_in_store(user, "recurrences", uid)
1.15 + if not filename or not exists(filename):
1.16 + return None
1.17 +
1.18 + return [name for name in listdir(filename) if isfile(join(filename, name))]
1.19 +
1.20 + def get_recurrence(self, user, uid, recurrenceid):
1.21 +
1.22 + """
1.23 + For the event of the given 'user' with the given 'uid', return the
1.24 + specific recurrence indicated by the 'recurrenceid'.
1.25 + """
1.26 +
1.27 + filename = self.get_object_in_store(user, "recurrences", uid, recurrenceid)
1.28 + if not filename or not exists(filename):
1.29 + return None
1.30 +
1.31 + return self._get_object(user, filename)
1.32 +
1.33 + def set_recurrence(self, user, uid, recurrenceid, node):
1.34 +
1.35 + "Set an event for 'user' having the given 'uid' and 'node'."
1.36 +
1.37 + filename = self.get_object_in_store(user, "recurrences", uid, recurrenceid)
1.38 + if not filename:
1.39 + return False
1.40 +
1.41 + return self._set_object(user, filename, node)
1.42 +
1.43 + def remove_recurrence(self, user, uid, recurrenceid):
1.44 +
1.45 + "Remove an event for 'user' having the given 'uid'."
1.46 +
1.47 + filename = self.get_object_in_store(user, "objects", uid)
1.48 + if not filename:
1.49 + return False
1.50 +
1.51 + return self._remove_object(filename)
1.52 +
1.53 def get_freebusy(self, user):
1.54
1.55 "Get free/busy details for the given 'user'."
2.1 --- a/imiptools/content.py Thu Feb 12 17:31:22 2015 +0100
2.2 +++ b/imiptools/content.py Thu Feb 12 17:44:01 2015 +0100
2.3 @@ -413,7 +413,15 @@
2.4
2.5 obj["ATTENDEE"] = attendee_map.items()
2.6
2.7 - self.store.set_event(identity, self.uid, obj.to_node())
2.8 + # Set the complete event if not an additional occurrence.
2.9 +
2.10 + event = obj.to_node()
2.11 + recurrenceid = obj.get_value("RECURRENCE-ID")
2.12 +
2.13 + if not recurrenceid:
2.14 + self.store.set_event(identity, self.uid, event)
2.15 + else:
2.16 + self.store.set_recurrence(identity, self.uid, recurrenceid, event)
2.17
2.18 return True
2.19
3.1 --- a/imiptools/handlers/person.py Thu Feb 12 17:31:22 2015 +0100
3.2 +++ b/imiptools/handlers/person.py Thu Feb 12 17:44:01 2015 +0100
3.3 @@ -49,9 +49,17 @@
3.4 if not self.have_new_object(attendee):
3.5 continue
3.6
3.7 - # Store the object and queue any request.
3.8 + # Set the complete event if not an additional occurrence.
3.9 +
3.10 + event = self.obj.to_node()
3.11 + recurrenceid = self.obj.get_value("RECURRENCE-ID")
3.12
3.13 - self.store.set_event(attendee, self.uid, self.obj.to_node())
3.14 + if not recurrenceid:
3.15 + self.store.set_event(attendee, self.uid, event)
3.16 + else:
3.17 + self.store.set_recurrence(attendee, self.uid, recurrenceid, event)
3.18 +
3.19 + # Queue any request.
3.20
3.21 if queue:
3.22 self.store.queue_request(attendee, self.uid)
4.1 --- a/imiptools/handlers/person_outgoing.py Thu Feb 12 17:31:22 2015 +0100
4.2 +++ b/imiptools/handlers/person_outgoing.py Thu Feb 12 17:44:01 2015 +0100
4.3 @@ -58,7 +58,17 @@
4.4 # Update the object.
4.5
4.6 if from_organiser:
4.7 - self.store.set_event(identity, self.uid, self.obj.to_node())
4.8 +
4.9 + # Set the complete event if not an additional occurrence.
4.10 +
4.11 + event = self.obj.to_node()
4.12 + recurrenceid = self.obj.get_value("RECURRENCE-ID")
4.13 +
4.14 + if not recurrenceid:
4.15 + self.store.set_event(identity, self.uid, event)
4.16 + else:
4.17 + self.store.set_recurrence(identity, self.uid, recurrenceid, event)
4.18 +
4.19 else:
4.20 organiser_item, attendees = self.require_organiser_and_attendees(from_organiser)
4.21 self.merge_attendance(attendees, identity)
4.22 @@ -128,7 +138,15 @@
4.23 obj["SEQUENCE"] = self.obj.get_items("SEQUENCE")
4.24 obj["DTSTAMP"] = self.obj.get_items("DTSTAMP")
4.25
4.26 - self.store.set_event(identity, self.uid, obj.to_node())
4.27 + # Set the complete event if not an additional occurrence.
4.28 +
4.29 + event = obj.to_node()
4.30 + recurrenceid = obj.get_value("RECURRENCE-ID")
4.31 +
4.32 + if not recurrenceid:
4.33 + self.store.set_event(identity, self.uid, event)
4.34 + else:
4.35 + self.store.set_recurrence(identity, self.uid, recurrenceid, event)
4.36
4.37 # Remove any associated request.
4.38
5.1 --- a/imiptools/handlers/resource.py Thu Feb 12 17:31:22 2015 +0100
5.2 +++ b/imiptools/handlers/resource.py Thu Feb 12 17:44:01 2015 +0100
5.3 @@ -84,8 +84,15 @@
5.4
5.5 self.update_dtstamp()
5.6
5.7 + # Set the complete event if not an additional occurrence.
5.8 +
5.9 event = self.obj.to_node()
5.10 - self.store.set_event(attendee, self.uid, event)
5.11 + recurrenceid = self.obj.get_value("RECURRENCE-ID")
5.12 +
5.13 + if not recurrenceid:
5.14 + self.store.set_event(attendee, self.uid, event)
5.15 + else:
5.16 + self.store.set_recurrence(attendee, self.uid, recurrenceid, event)
5.17
5.18 # Only update free/busy details if the event is scheduled.
5.19