# HG changeset patch # User Paul Boddie # Date 1423159320 -3600 # Node ID fb9f8f162b0b7cd7df8ced5d4511e4130425d119 # Parent 25d95e83d7700d43d3d0f287fa38740039a3d35c Merge attendance details into stored events rather than always overwriting them. diff -r 25d95e83d770 -r fb9f8f162b0b imiptools/content.py --- a/imiptools/content.py Thu Feb 05 19:01:22 2015 +0100 +++ b/imiptools/content.py Thu Feb 05 19:02:00 2015 +0100 @@ -175,8 +175,39 @@ def update_freebusy(self, freebusy, attendee, periods): return update_freebusy(freebusy, attendee, periods, self.obj.get_value("TRANSP"), self.uid, self.store) - def update_freebusy_for_other(self, freebusy, user, other, periods): - return update_freebusy_for_other(freebusy, user, other, periods, self.obj.get_value("TRANSP"), self.uid, self.store) + def update_freebusy_from_organiser(self, attendee, organiser_item): + + """ + For the 'attendee', record free/busy information from the + 'organiser_item' (a value plus attributes). + """ + + organiser, organiser_attr = organiser_item + + if organiser != attendee: + freebusy = self.store.get_freebusy_for_other(attendee, organiser) + + if organiser_attr.get("PARTSTAT") != "DECLINED": + update_freebusy_for_other(freebusy, attendee, organiser, + self.obj.get_periods(), self.obj.get_value("TRANSP"), + self.uid, self.store) + else: + self.remove_from_freebusy_for_other(freebusy, attendee, organiser) + + def update_freebusy_from_attendees(self, organiser, attendees): + + "For the 'organiser', record free/busy information from 'attendees'." + + for attendee, attendee_attr in attendees.items(): + if organiser != attendee: + freebusy = self.store.get_freebusy_for_other(organiser, attendee) + + if attendee_attr.get("PARTSTAT") != "DECLINED": + update_freebusy_for_other(freebusy, organiser, attendee, + self.obj.get_periods(), self.obj.get_value("TRANSP"), + self.uid, self.store) + else: + self.remove_from_freebusy_for_other(freebusy, organiser, attendee) def can_schedule(self, freebusy, periods): return can_schedule(freebusy, periods, self.uid) @@ -328,6 +359,36 @@ return False + def merge_attendance(self, attendees, identity): + + """ + Merge attendance from the current object's 'attendees' into the version + stored for the given 'identity'. + """ + + obj = self.get_object(identity) + + if not obj or not self.have_new_object(identity, obj=obj): + return False + + # Get attendee details in a usable form. + + attendee_map = uri_dict(obj.get_value_map("ATTENDEE")) + + for attendee, attendee_attr in attendees.items(): + + # Update attendance in the loaded object. + + attendee_map[attendee] = attendee_attr + + # Set the new details and store the object. + + obj["ATTENDEE"] = attendee_map.items() + + self.store.set_event(identity, self.uid, obj.to_node()) + + return True + def update_dtstamp(self): "Update the DTSTAMP in the current object." diff -r 25d95e83d770 -r fb9f8f162b0b imiptools/handlers/person.py --- a/imiptools/handlers/person.py Thu Feb 05 19:01:22 2015 +0100 +++ b/imiptools/handlers/person.py Thu Feb 05 19:02:00 2015 +0100 @@ -47,16 +47,6 @@ if not self.have_new_object(attendee): continue - # Record other party free/busy information. - - if organiser != attendee: - freebusy = self.store.get_freebusy_for_other(attendee, organiser) - - if organiser_attr.get("PARTSTAT") != "DECLINED": - self.update_freebusy_for_other(freebusy, attendee, organiser, self.obj.get_periods()) - else: - self.remove_from_freebusy_for_other(freebusy, attendee, organiser) - # Store the object and queue any request. self.store.set_event(attendee, self.uid, self.obj.to_node()) @@ -75,38 +65,13 @@ if self.publisher: self.publisher.set_freebusy(attendee, freebusy) + self.update_freebusy_from_organiser(attendee, organiser_item) + # As organiser, update attendance. else: - obj = self.get_object(organiser) - - if obj and self.have_new_object(organiser, obj=obj): - - # Get attendee details in a usable form. - - attendee_map = uri_dict(obj.get_value_map("ATTENDEE")) - - for attendee, attendee_attr in attendees.items(): - - # Update attendance in the loaded object. - - attendee_map[attendee] = attendee_attr - - # Record other party free/busy information. - - if organiser != attendee: - freebusy = self.store.get_freebusy_for_other(organiser, attendee) - - if attendee_attr.get("PARTSTAT") != "DECLINED": - self.update_freebusy_for_other(freebusy, organiser, attendee, self.obj.get_periods()) - else: - self.remove_from_freebusy_for_other(freebusy, organiser, attendee) - - # Set the new details and store the object. - - obj["ATTENDEE"] = attendee_map.items() - - self.store.set_event(organiser, self.uid, obj.to_node()) + if self.merge_attendance(attendees, organiser): + self.update_freebusy_from_attendees(organiser, attendees) return True diff -r 25d95e83d770 -r fb9f8f162b0b imiptools/handlers/person_outgoing.py --- a/imiptools/handlers/person_outgoing.py Thu Feb 05 19:01:22 2015 +0100 +++ b/imiptools/handlers/person_outgoing.py Thu Feb 05 19:02:00 2015 +0100 @@ -53,9 +53,13 @@ identity, attr = item - # Store the object. + # Update the object. - self.store.set_event(identity, self.uid, self.obj.to_node()) + if from_organiser: + self.store.set_event(identity, self.uid, self.obj.to_node()) + else: + organiser_item, attendees = self.require_organiser_and_attendees(from_organiser) + self.merge_attendance(attendees, identity) # Remove any associated request.