# HG changeset patch # User Paul Boddie # Date 1422897409 -3600 # Node ID c60f358ebe0ba0372835fdaf99382f34d95359cb # Parent 99b315666de4151e5e2c24a970d3fe8d7557b81a# Parent 841c99fe689bb847f9846d5fec4f072872c18303 Merged previous free/busy bundling changes, making bundled parts dependent on generated content from any free/busy handler (which may already be replying to free/busy requests, thus eliminating any need to publish free/busy content speculatively). diff -r 99b315666de4 -r c60f358ebe0b imiptools/__init__.py --- a/imiptools/__init__.py Mon Feb 02 18:05:31 2015 +0100 +++ b/imiptools/__init__.py Mon Feb 02 18:16:49 2015 +0100 @@ -21,9 +21,11 @@ from email import message_from_file from imiptools.content import handle_itip_part -from imiptools.data import get_addresses, get_uri +from imiptools.data import get_addresses, get_uri, make_freebusy, to_part +from imiptools.dates import get_timestamp from imiptools.mail import Messenger from imiptools.profile import Preferences +import imip_store import sys # Postfix exit codes. @@ -120,7 +122,16 @@ # Reply using any outgoing parts in a new message. if outgoing_parts: + + # Obtain free/busy details, if configured to do so. + + fb = self.can_provide_freebusy(handlers) and self.get_freebusy_for_recipient(recipient) + for outgoing_recipient, parts in outgoing_parts.items(): + + # Bundle free/busy messages, if configured to do so. + + if fb: parts.append(fb) message = self.messenger.make_outgoing_message(parts, [outgoing_recipient]) if "-d" in sys.argv: @@ -169,6 +180,40 @@ elif self.lmtp_socket: self.messenger.sendmail(recipient, msg.as_string(), lmtp_socket=self.lmtp_socket) + def can_provide_freebusy(self, handlers): + + "Test for any free/busy information produced by 'handlers'." + + fbhandler = handlers.get("VFREEBUSY") + if fbhandler: + fbmethods = fbhandler.get_outgoing_methods() + return not "REPLY" in fbmethods and not "PUBLISH" in fbmethods + else: + return False + + def get_freebusy_for_recipient(self, recipient): + + """ + Return a list of responses containing free/busy information for the + given 'recipient'. + """ + + organiser = get_uri(recipient) + preferences = Preferences(organiser) + + if preferences.get("freebusy_sharing") == "share" and \ + preferences.get("freebusy_bundling") == "always": + + # Invent a unique identifier. + + utcnow = get_timestamp() + uid = "imip-agent-%s-%s" % (utcnow, recipient) + + freebusy = imip_store.FileStore().get_freebusy(organiser) + return to_part("PUBLISH", [make_freebusy(freebusy, uid, organiser)]) + + return None + def process_args(self, args, stream): """