From bfb7a3f656bfccaa0d48a14e530d367146d29a6c Mon Sep 17 00:00:00 2001 From: Dheepak Krishnamurthy Date: Sun, 14 Aug 2016 21:25:14 -0700 Subject: [PATCH] Add user_availability as a service to pyexchange --- pyexchange/exchange2010/__init__.py | 27 ++++++++ pyexchange/exchange2010/soap_request.py | 84 +++++++++++++++++++++++++ 2 files changed, 111 insertions(+) diff --git a/pyexchange/exchange2010/__init__.py b/pyexchange/exchange2010/__init__.py index d27d939..d15da56 100644 --- a/pyexchange/exchange2010/__init__.py +++ b/pyexchange/exchange2010/__init__.py @@ -24,6 +24,9 @@ class Exchange2010Service(ExchangeServiceSOAP): + def availability(self, email, start, end): + return Exchange2010AvailabilityService(service=self, email=email, start=start, end=end) + def calendar(self, id="calendar"): return Exchange2010CalendarService(service=self, calendar_id=id) @@ -914,3 +917,27 @@ def _parse_parent_id_and_change_key_from_response(self, response): return id_element.get(u"Id", None), id_element.get(u"ChangeKey", None) else: return None, None + +class Exchange2010AvailabilityService(object): + def __init__(self, service, email, start, end): + self.service = service + body = soap_request.get_user_availability(email, start=start, end=end) + response_xml = self.service.send(body) + self.service._check_for_errors(response_xml) + self._parse_all_options(response_xml) + + def _parse_all_options(self, response): + property_map = { + u'starttime': {u'xpath': u't:StartTime'}, + u'endtime': {u'xpath': u't:EndTime'}, + } + self.list_slots = [] + calendar_events = response.xpath(u'//m:GetUserAvailabilityResponse/m:FreeBusyResponseArray/m:FreeBusyResponse/m:FreeBusyView/t:CalendarEventArray/t:CalendarEvent', + namespaces=soap_request.NAMESPACES) + for event in calendar_events: + self.list_slots.append(self.service._xpath_to_dict(element=event, + property_map=property_map, + namespace_map=soap_request.NAMESPACES) + ) + return self.list_slots + diff --git a/pyexchange/exchange2010/soap_request.py b/pyexchange/exchange2010/soap_request.py index 5de16e9..f87550c 100644 --- a/pyexchange/exchange2010/soap_request.py +++ b/pyexchange/exchange2010/soap_request.py @@ -625,3 +625,87 @@ def update_item(event, updated_attributes, calendar_item_update_operation_type): ) return root + + +def get_user_availability(user_email, calendar_id=u'calendar', start=None, end=None,): + """ + + + + + mack@contoso.com + + Organizer + false + + + + sadie@contoso.com + + Required + false + + + + + 2014-02-13T00:00:00 + 2014-02-14T00:00:00 + + 30 + FreeBusy + + + 49 + 2 + 0 + 60 + Good + + 2014-02-13T00:00:00 + 2014-02-14T00:00:00 + + + + """ + start = start.strftime(EXCHANGE_DATETIME_FORMAT) + end = end.strftime(EXCHANGE_DATETIME_FORMAT) + + root = M.GetUserAvailabilityRequest( + T.TimeZone( + T.Bias('480'), + T.StandardTime( + T.Bias('0'), + T.Time('02:00:00'), + T.DayOrder('5'), + T.Month('10'), + T.DayOfWeek('Sunday') + ), + T.DaylightTime( + T.Bias('-60'), + T.Time('02:00:00'), + T.DayOrder('1'), + T.Month('4'), + T.DayOfWeek('Sunday') + ) + ), + M.MailboxDataArray( + T.MailboxData( + T.Email( + T.Address(user_email) + ), + T.AttendeeType('Required'), + T.ExcludeConflicts('false') + ) + ), + T.FreeBusyViewOptions( + T.TimeWindow( + T.StartTime(start), + T.EndTime(end), + ), + T.MergedFreeBusyIntervalInMinutes('60'), + T.RequestedView('FreeBusy') + ) + + ) + + return root