1.1 --- a/imiptools/content.py Tue Nov 25 18:25:44 2014 +0100
1.2 +++ b/imiptools/content.py Tue Nov 25 18:26:30 2014 +0100
1.3 @@ -292,6 +292,9 @@
1.4 return to_dict(obj)
1.5 finally:
1.6 f.close()
1.7 +
1.8 + # NOTE: Handle parse errors properly.
1.9 +
1.10 except (ParseError, ValueError):
1.11 pass
1.12
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
2.2 +++ b/imiptools/handlers/common.py Tue Nov 25 18:26:30 2014 +0100
2.3 @@ -0,0 +1,58 @@
2.4 +#!/usr/bin/env python
2.5 +
2.6 +"""
2.7 +Common handler functionality for different entities.
2.8 +"""
2.9 +
2.10 +from imiptools.content import to_part
2.11 +
2.12 +class CommonFreebusy:
2.13 +
2.14 + "Common free/busy mix-in."
2.15 +
2.16 + def request(self):
2.17 +
2.18 + """
2.19 + Respond to a request by preparing a reply containing free/busy
2.20 + information for each indicated attendee.
2.21 + """
2.22 +
2.23 + oa = self.require_organiser_and_attendees()
2.24 + if not oa:
2.25 + return None
2.26 +
2.27 + (organiser, organiser_attr), attendees = organiser_item, attendees = oa
2.28 +
2.29 + # Validate the organiser, ignoring spoofed requests.
2.30 +
2.31 + if not self.validate_identities([organiser_item]):
2.32 + return None
2.33 +
2.34 + # Construct an appropriate fragment.
2.35 +
2.36 + calendar = []
2.37 + cwrite = calendar.append
2.38 +
2.39 + # Get the details for each attendee.
2.40 +
2.41 + for attendee, attendee_attr in attendees.items():
2.42 + freebusy = self.store.get_freebusy(attendee)
2.43 +
2.44 + record = []
2.45 + rwrite = record.append
2.46 +
2.47 + rwrite(("ORGANIZER", organiser_attr, organiser))
2.48 + rwrite(("ATTENDEE", attendee_attr, attendee))
2.49 + rwrite(("UID", {}, self.uid))
2.50 +
2.51 + if freebusy:
2.52 + for start, end, uid in freebusy:
2.53 + rwrite(("FREEBUSY", {"FBTYPE" : "BUSY"}, [start, end]))
2.54 +
2.55 + cwrite(("VFREEBUSY", {}, record))
2.56 +
2.57 + # Return the reply.
2.58 +
2.59 + return "REPLY", to_part("REPLY", calendar)
2.60 +
2.61 +# vim: tabstop=4 expandtab shiftwidth=4
3.1 --- a/imiptools/handlers/person.py Tue Nov 25 18:25:44 2014 +0100
3.2 +++ b/imiptools/handlers/person.py Tue Nov 25 18:26:30 2014 +0100
3.3 @@ -7,6 +7,7 @@
3.4 from email.mime.text import MIMEText
3.5 from imiptools.config import MANAGER_PATH, MANAGER_URL
3.6 from imiptools.content import Handler, to_part
3.7 +from imiptools.handlers.common import CommonFreebusy
3.8 from socket import gethostname
3.9 from vCalendar import to_node
3.10
3.11 @@ -150,7 +151,7 @@
3.12 url = "%s/%s" % (get_manager_url().rstrip("/"), self.uid)
3.13 return "REQUEST", MIMEText("A request has been queued and can be viewed here: %s" % url)
3.14
3.15 -class Freebusy(PersonHandler):
3.16 +class Freebusy(PersonHandler, CommonFreebusy):
3.17
3.18 "A free/busy handler."
3.19
3.20 @@ -176,46 +177,9 @@
3.21 information for each indicated attendee.
3.22 """
3.23
3.24 - # NOTE: This is currently the same as the resource handler but should be
3.25 - # NOTE: subject to policy/preferences.
3.26 -
3.27 - oa = self.require_organiser_and_attendees()
3.28 - if not oa:
3.29 - return None
3.30 -
3.31 - (organiser, organiser_attr), attendees = organiser_item, attendees = oa
3.32 -
3.33 - # Validate the organiser, ignoring spoofed requests.
3.34 -
3.35 - if not self.validate_identities([organiser_item]):
3.36 - return None
3.37 -
3.38 - # Construct an appropriate fragment.
3.39 -
3.40 - calendar = []
3.41 - cwrite = calendar.append
3.42 + # NOTE: This should be subject to policy/preferences.
3.43
3.44 - # Get the details for each attendee.
3.45 -
3.46 - for attendee, attendee_attr in attendees.items():
3.47 - freebusy = self.store.get_freebusy(attendee)
3.48 -
3.49 - record = []
3.50 - rwrite = record.append
3.51 -
3.52 - rwrite(("ORGANIZER", organiser_attr, organiser))
3.53 - rwrite(("ATTENDEE", attendee_attr, attendee))
3.54 - rwrite(("UID", {}, self.uid))
3.55 -
3.56 - if freebusy:
3.57 - for start, end, uid in freebusy:
3.58 - rwrite(("FREEBUSY", {"FBTYPE" : "BUSY"}, [start, end]))
3.59 -
3.60 - cwrite(("VFREEBUSY", {}, record))
3.61 -
3.62 - # Return the reply.
3.63 -
3.64 - return "REPLY", to_part("REPLY", calendar)
3.65 + return CommonFreebusy.request(self)
3.66
3.67 class Journal(PersonHandler):
3.68
4.1 --- a/imiptools/handlers/resource.py Tue Nov 25 18:25:44 2014 +0100
4.2 +++ b/imiptools/handlers/resource.py Tue Nov 25 18:26:30 2014 +0100
4.3 @@ -5,6 +5,7 @@
4.4 """
4.5
4.6 from imiptools.content import Handler, format_datetime, get_address, get_uri, to_part
4.7 +from imiptools.handlers.common import CommonFreebusy
4.8 from vCalendar import to_node
4.9
4.10 class Event(Handler):
4.11 @@ -100,7 +101,7 @@
4.12
4.13 return "REPLY", to_part("REPLY", calendar)
4.14
4.15 -class Freebusy(Handler):
4.16 +class Freebusy(Handler, CommonFreebusy):
4.17
4.18 "A free/busy handler."
4.19
4.20 @@ -113,50 +114,7 @@
4.21
4.22 pass
4.23
4.24 - def request(self):
4.25 -
4.26 - """
4.27 - Respond to a request by preparing a reply containing free/busy
4.28 - information for each indicated attendee.
4.29 - """
4.30 -
4.31 - oa = self.require_organiser_and_attendees()
4.32 - if not oa:
4.33 - return None
4.34 -
4.35 - (organiser, organiser_attr), attendees = organiser_item, attendees = oa
4.36 -
4.37 - # Validate the organiser, ignoring spoofed requests.
4.38 -
4.39 - if not self.validate_identities([organiser_item]):
4.40 - return None
4.41 -
4.42 - # Construct an appropriate fragment.
4.43 -
4.44 - calendar = []
4.45 - cwrite = calendar.append
4.46 -
4.47 - # Get the details for each attendee.
4.48 -
4.49 - for attendee, attendee_attr in attendees.items():
4.50 - freebusy = self.store.get_freebusy(attendee)
4.51 -
4.52 - record = []
4.53 - rwrite = record.append
4.54 -
4.55 - rwrite(("ORGANIZER", organiser_attr, organiser))
4.56 - rwrite(("ATTENDEE", attendee_attr, attendee))
4.57 - rwrite(("UID", {}, self.uid))
4.58 -
4.59 - if freebusy:
4.60 - for start, end, uid in freebusy:
4.61 - rwrite(("FREEBUSY", {"FBTYPE" : "BUSY"}, [start, end]))
4.62 -
4.63 - cwrite(("VFREEBUSY", {}, record))
4.64 -
4.65 - # Return the reply.
4.66 -
4.67 - return "REPLY", to_part("REPLY", calendar)
4.68 + # request provided by CommonFreeBusy.request
4.69
4.70 class Journal(Handler):
4.71