# HG changeset patch # User Paul Boddie # Date 1411398651 -7200 # Node ID 7ee650e7ac0ac402a4ade9dda70b5f04d0b95e60 # Parent bcc012bf5481250003e38ca854b9a19362788e8b Added some support for the proper production of free/busy replies. Added a convenience function for attribute and value retrieval. diff -r bcc012bf5481 -r 7ee650e7ac0a imip_agent.py --- a/imip_agent.py Mon Sep 22 17:08:57 2014 +0200 +++ b/imip_agent.py Mon Sep 22 17:10:51 2014 +0200 @@ -1,7 +1,7 @@ #!/usr/bin/env python from email import message_from_file -from vCalendar import parse +from vCalendar import parse, iterwrite import imip_store import sys @@ -62,6 +62,18 @@ d[name].append((attr, value)) return d +def get_attr_value(d, name, single=True): + if d.has_key(name): + values = d[name] + if isinstance(values, tuple): + return values + elif single and len(values) == 1: + return values[0] + else: + return values + else: + return None + def get_value(d, name, single=True): if d.has_key(name): values = d[name] @@ -104,7 +116,10 @@ def publish(self): pass - def get_value(self, name, single=False): + def get_attr_value(self, name, single=True): + return get_attr_value(self.details, name, single) + + def get_value(self, name, single=True): return get_value(self.details, name, single) class Event(Handler): @@ -139,19 +154,45 @@ # Store the reply details for the attendee. def request(self): - attendees = self.get_value("ATTENDEE", False) - organiser = self.get_value("ORGANIZER") - print >>open("/tmp/imip.txt", "a"), attendees, organiser + attendees = self.get_attr_value("ATTENDEE", False) + organiser = self.get_attr_value("ORGANIZER") + if not attendees and not organiser: return + organiser_attr, organiser = organiser + # Get the details for the attendee. - for attendee in attendees: - freebusy = self.store.get_freebusy(attendee) - print >>open("/tmp/imip.txt", "a"), freebusy + out = open("/tmp/imip.txt", "a") + try: + w = iterwrite(out) + + calendar = [] + cwrite = calendar.append + cwrite(("METHOD", {}, "REPLY")) + cwrite(("VERSION", {}, "2.0")) - # Send a reply with the information. + for attendee_attr, attendee in attendees: + freebusy = self.store.get_freebusy(attendee) + if freebusy: + record = [] + rwrite = record.append + rwrite(("ORGANIZER", organiser_attr, organiser)) + rwrite(("ATTENDEE", attendee_attr, attendee)) + rwrite(("UID", {}, self.uid)) + + for start, end in freebusy: + rwrite(("FREEBUSY", {}, [start, end])) + + cwrite(("VFREEBUSY", {}, record)) + + # Send a reply with the information. + + w.write("VCALENDAR", {}, calendar) + + finally: + out.close() class Journal(Handler): def add(self):