# HG changeset patch # User Paul Boddie # Date 1422896731 -3600 # Node ID 99b315666de4151e5e2c24a970d3fe8d7557b81a # Parent a494789967a2a7dfebec29cd17040468225b519f Record results in handlers so that the activities of handlers can be inspected afterwards. The need to return information from each level is also eliminated. diff -r a494789967a2 -r 99b315666de4 imiptools/__init__.py --- a/imiptools/__init__.py Mon Feb 02 17:38:01 2015 +0100 +++ b/imiptools/__init__.py Mon Feb 02 18:05:31 2015 +0100 @@ -80,16 +80,14 @@ may be constructed according to individual preferences. """ - all_responses = [] + handlers = dict([(name, cls(senders, recipient, self.messenger)) for name, cls in self.handlers]) handled = False - handlers = dict([(name, cls(senders, recipient, self.messenger)) for name, cls in self.handlers]) - for part in msg.walk(): if part.get_content_type() in itip_content_types and \ - part.get_param("method"): + part.get_param("method"): - all_responses += handle_itip_part(part, handlers) + handle_itip_part(part, handlers) handled = True # When processing outgoing messages, no replies or deliveries are @@ -98,6 +96,12 @@ if outgoing_only: return + # Get responses from the handlers. + + all_responses = [] + for handler in handlers.values(): + all_responses += handler.get_results() + # Pack any returned parts into messages. if all_responses: diff -r a494789967a2 -r 99b315666de4 imiptools/content.py --- a/imiptools/content.py Mon Feb 02 17:38:01 2015 +0100 +++ b/imiptools/content.py Mon Feb 02 18:05:31 2015 +0100 @@ -153,7 +153,7 @@ # Ignore the part if not a calendar object. if not itip: - return [] + return # Require consistency between declared and employed methods. @@ -176,18 +176,7 @@ # Dispatch to a handler and obtain any response. handler.set_object(Object({name : item})) - results = methods[method](handler)() - - # Aggregate responses for a single message. - - if results: - for result in results: - outgoing_recipients, part = result - all_results.append((outgoing_recipients, part)) - - return all_results - - return [] + methods[method](handler)() # References to the Web interface. @@ -213,6 +202,9 @@ self.recipient = recipient and get_address(recipient) self.messenger = messenger + self.results = [] + self.outgoing_methods = set() + self.obj = None self.uid = None self.sequence = None @@ -242,7 +234,26 @@ "message, you may view the details here:\n\n%s" % get_object_url(self.uid)) - return [(None, MIMEText("\n".join(texts)))] + return self.add_result(None, None, MIMEText("\n".join(texts))) + + # Result registration. + + def add_result(self, method, outgoing_recipients, part): + + """ + Record a result having the given 'method', 'outgoing_recipients' and + message part. + """ + + if outgoing_recipients: + self.outgoing_methods.add(method) + self.results.append((outgoing_recipients, part)) + + def get_results(self): + return self.results + + def get_outgoing_methods(self): + return self.outgoing_methods # Access to calendar structures and other data. diff -r a494789967a2 -r 99b315666de4 imiptools/handlers/common.py --- a/imiptools/handlers/common.py Mon Feb 02 17:38:01 2015 +0100 +++ b/imiptools/handlers/common.py Mon Feb 02 18:05:31 2015 +0100 @@ -34,7 +34,7 @@ oa = self.require_organiser_and_attendees() if not oa: - return None + return (organiser, organiser_attr), attendees = oa @@ -51,6 +51,6 @@ # Return the reply. - return [([get_address(organiser)], to_part("REPLY", responses))] + self.add_result("REPLY", [get_address(organiser)], to_part("REPLY", responses)) # vim: tabstop=4 expandtab shiftwidth=4 diff -r a494789967a2 -r 99b315666de4 imiptools/handlers/resource.py --- a/imiptools/handlers/resource.py Mon Feb 02 17:38:01 2015 +0100 +++ b/imiptools/handlers/resource.py Mon Feb 02 18:05:31 2015 +0100 @@ -112,7 +112,6 @@ "Cancel attendance for attendees." self._record_and_respond(self._cancel_for_attendee) - return None def counter(self): @@ -152,9 +151,7 @@ response = self._record_and_respond(self._schedule_for_attendee) if response: - return [(map(get_address, self.obj.get_values("ORGANIZER")), to_part("REPLY", response))] - else: - return None + self.add_result("REPLY", map(get_address, self.obj.get_values("ORGANIZER")), to_part("REPLY", response)) class Freebusy(ResourceHandler, CommonFreebusy):