import pyperclip import mimetypes import os import urllib from adal import AuthenticationContext import requests import config from datetime import datetime from datetime import date from datetime import timedelta import pytz import oauth2ms def api_endpoint(url): """Convert a relative path such as /me/photo/$value to a full URI based on the current RESOURCE and API_VERSION settings in config.py. """ if urllib.parse.urlparse(url).scheme in ['http', 'https']: return url # url is already complete return urllib.parse.urljoin(f'{config.RESOURCE}/v{config.API_VERSION}/', url.lstrip('/')) def parse_cal_date(dateStr): d = datetime.strptime(dateStr, "%Y-%m-%dT%H:%M:%S.0000000") exchangeTz = pytz.utc localTz = pytz.timezone('US/Central') return exchangeTz.localize(d).astimezone(localTz); def format_orgmode_date(dateObj): return dateObj.strftime("%Y-%m-%d %H:%M") def format_orgmode_time(dateObj): return dateObj.strftime("%H:%M") def get_calendar(token): """Get Calendar from O365 """ start = date.today() - timedelta(days=config.daysHistory) end = date.today() + timedelta(days=config.daysFuture) # print(api_endpoint("/")) cal = requests.get( api_endpoint(f'me/calendarview?startdatetime={start}T00:00:00.000Z&enddatetime={end}T23:59:59.999Z&$top={config.maxEntries}&$orderby=start/dateTime'), headers={'Authorization':f'Bearer {token}'} ) calentries = cal.json() for appt in calentries['value']: apptstart = parse_cal_date(appt['start']['dateTime']) apptend = parse_cal_date(appt['end']['dateTime']) tags = "" if appt['categories']: tags = ":" + ":".join(appt['categories']) + ":" else: tags = ":WORK:" if apptstart.date() == apptend.date(): dateStr = "<" + format_orgmode_date(apptstart) + "-" + format_orgmode_time(apptend) + ">" else: dateStr = "<" + format_orgmode_date(apptstart) + ">--<" + format_orgmode_date(apptend) + ">" body = appt['bodyPreview'].translate({ord('\r'): None}) print(f'* {dateStr} {appt["subject"]} {tags}') print(":PROPERTIES:") if appt['location']['displayName'] is not None: print(":LOCATION: %s" % (appt['location']['displayName'])) if appt['onlineMeeting'] is not None: print(f":JOINURL: {appt['onlineMeeting']['joinUrl']}") print(f":RESPONSE: {appt['responseStatus']['response']}") print(":END:") print(f"{body}") print("") if __name__ == '__main__': get_calendar(oauth2ms.token)