# HG changeset patch # User Paul Boddie # Date 1423422397 -3600 # Node ID 2d99e19c0cc3a33de2cb027bdc6f71e7b643be83 # Parent e28bfb8b0ca1aa98f9f7845d5ae746eb6e8ee4f1 Added missing SENT-BY properties to free/busy messages. Removed attendee constraints when receiving published free/busy resources. diff -r e28bfb8b0ca1 -r 2d99e19c0cc3 imip_manager.py --- a/imip_manager.py Sun Feb 08 18:39:03 2015 +0100 +++ b/imip_manager.py Sun Feb 08 20:06:37 2015 +0100 @@ -158,7 +158,12 @@ uid = "imip-agent-%s-%s" % (utcnow, get_address(self.user)) freebusy = self.store.get_freebusy(self.user) - parts.append(to_part("PUBLISH", [make_freebusy(freebusy, uid, self.user)])) + user_attr = self.messenger and self.messenger.sender != get_address(self.user) and \ + {"SENT-BY" : get_uri(self.messenger.sender)} or {} + + parts.append(to_part("PUBLISH", [ + make_freebusy(freebusy, uid, self.user, user_attr) + ])) message = self.messenger.make_outgoing_message(parts, recipients, outgoing_bcc=sender) self.messenger.sendmail(recipients, message.as_string(), outgoing_bcc=sender) diff -r e28bfb8b0ca1 -r 2d99e19c0cc3 imiptools/__init__.py --- a/imiptools/__init__.py Sun Feb 08 18:39:03 2015 +0100 +++ b/imiptools/__init__.py Sun Feb 08 20:06:37 2015 +0100 @@ -201,6 +201,8 @@ organiser = get_uri(recipient) preferences = Preferences(organiser) + organiser_attr = self.messenger and {"SENT-BY" : get_uri(self.messenger.sender)} or {} + if preferences.get("freebusy_sharing") == "share" and \ preferences.get("freebusy_bundling") == "always": @@ -210,7 +212,7 @@ uid = "imip-agent-%s-%s" % (utcnow, recipient) freebusy = imip_store.FileStore().get_freebusy(organiser) - return to_part("PUBLISH", [make_freebusy(freebusy, uid, organiser)]) + return to_part("PUBLISH", [make_freebusy(freebusy, uid, organiser, organiser_attr)]) return None diff -r e28bfb8b0ca1 -r 2d99e19c0cc3 imiptools/content.py --- a/imiptools/content.py Sun Feb 08 18:39:03 2015 +0100 +++ b/imiptools/content.py Sun Feb 08 20:06:37 2015 +0100 @@ -250,17 +250,36 @@ else: return mapping - def require_organiser_and_attendees(self, from_organiser=True): + def require_organiser(self, from_organiser=True): """ - Return the organiser and attendees for the current object, filtered for - the recipient of interest. Return None if no identities are eligible. + Return the organiser for the current object, filtered for the sender or + recipient of interest. Return None if no identities are eligible. + + The organiser identity is normalized. + """ + + organiser_item = uri_item(self.obj.get_item("ORGANIZER")) + + # Only provide details for an organiser who sent/receives the message. + + organiser_filter_fn = from_organiser and self.filter_by_senders or self.filter_by_recipient - Organiser and attendee identities are provided as lower case values. + if not organiser_filter_fn(dict([organiser_item])): + return None + + return organiser_item + + def require_attendees(self, from_organiser=True): + + """ + Return the attendees for the current object, filtered for the sender or + recipient of interest. Return None if no identities are eligible. + + The attendee identities are normalized. """ attendee_map = uri_dict(self.obj.get_value_map("ATTENDEE")) - organiser_item = uri_item(self.obj.get_item("ORGANIZER")) # Only provide details for attendees who sent/receive the message. @@ -270,14 +289,21 @@ for attendee in attendee_filter_fn(attendee_map): attendees[attendee] = attendee_map[attendee] - if not attendees or not organiser_item: - return None + return attendees + + def require_organiser_and_attendees(self, from_organiser=True): + + """ + Return the organiser and attendees for the current object, filtered for + the recipient of interest. Return None if no identities are eligible. - # Only provide details for an organiser who sent/receives the message. + Organiser and attendee identities are normalized. + """ - organiser_filter_fn = from_organiser and self.filter_by_senders or self.filter_by_recipient + organiser_item = self.require_organiser(from_organiser) + attendees = self.require_attendees(from_organiser) - if not organiser_filter_fn(dict([organiser_item])): + if not attendees or not organiser_item: return None return organiser_item, attendees diff -r e28bfb8b0ca1 -r 2d99e19c0cc3 imiptools/data.py --- a/imiptools/data.py Sun Feb 08 18:39:03 2015 +0100 +++ b/imiptools/data.py Sun Feb 08 20:06:37 2015 +0100 @@ -101,21 +101,22 @@ nodes ) -def make_freebusy(freebusy, uid, organiser, attendee=None): +def make_freebusy(freebusy, uid, organiser, organiser_attr=None, attendee=None, attendee_attr=None): """ Return a calendar node defining the free/busy details described in the given - 'freebusy' list, employing the given 'uid', for the given 'organiser', with - the optional 'attendee' providing recipient details. + 'freebusy' list, employing the given 'uid', for the given 'organiser' and + optional 'organiser_attr', with the optional 'attendee' providing recipient + details together with the optional 'attendee_attr'. """ record = [] rwrite = record.append - rwrite(("ORGANIZER", {}, organiser)) + rwrite(("ORGANIZER", organiser_attr or {}, organiser)) if attendee: - rwrite(("ATTENDEE", {}, attendee)) + rwrite(("ATTENDEE", attendee_attr or {}, attendee)) rwrite(("UID", {}, uid)) diff -r e28bfb8b0ca1 -r 2d99e19c0cc3 imiptools/handlers/common.py --- a/imiptools/handlers/common.py Sun Feb 08 18:39:03 2015 +0100 +++ b/imiptools/handlers/common.py Sun Feb 08 20:06:37 2015 +0100 @@ -19,7 +19,7 @@ this program. If not, see . """ -from imiptools.data import get_address, make_freebusy, to_part +from imiptools.data import get_address, get_uri, make_freebusy, to_part class CommonFreebusy: @@ -47,7 +47,13 @@ for attendee, attendee_attr in attendees.items(): freebusy = self.store.get_freebusy(attendee) - rwrite(make_freebusy(freebusy, self.uid, organiser, attendee)) + + # Indicate the actual sender of the reply. + + if self.messenger: + attendee_attr["SENT-BY"] = get_uri(self.messenger.sender) + + rwrite(make_freebusy(freebusy, self.uid, organiser, organiser_attr, attendee, attendee_attr)) # Return the reply. diff -r e28bfb8b0ca1 -r 2d99e19c0cc3 imiptools/handlers/person.py --- a/imiptools/handlers/person.py Sun Feb 08 18:39:03 2015 +0100 +++ b/imiptools/handlers/person.py Sun Feb 08 20:06:37 2015 +0100 @@ -79,15 +79,22 @@ "Record free/busy information for the received information." - oa = self.require_organiser_and_attendees(from_organiser) - if not oa: - return + if from_organiser: + organiser_item = self.require_organiser(from_organiser) + if not organiser_item: + return - organiser_item, attendees = oa - senders = from_organiser and [organiser_item] or attendees + senders = [organiser_item] + else: + oa = self.require_organiser_and_attendees(from_organiser) + if not oa: + return - if not senders: - return + organiser_item, attendees = oa + senders = attendees.items() + + if not senders: + return freebusy = []