libs/google/calendar.py (182 lines of code) (raw):
import json
from google.controller import GoogleApiController
from helper_functions import HelperFunctions
class GoogleCalendarApi(GoogleApiController):
def __init__(self, oauth):
self.oauth = oauth
self.service = self._get_service("calendar", "v3")
def get_calendar_id(self):
"""
Gets the Calendar ID for a user.
:return: str(calendar_id)
"""
try:
r = json.loads(self.call_google_api(service=self.service,
api_resource="calendars",
api_method="get",
response_field="id",
calendarId="primary"))
return r
except(ValueError, KeyError, TypeError):
return None
def list_events(self, user_email, role="organizer"):
"""
Lists the future dated events of a user.
:param user_email: user_email
:param role: organizer: attendee: owned_single_event
:return: List of event ids.
"""
now = HelperFunctions().date_now()
events = []
r = json.loads(self.call_google_api(service=self.service,
api_resource="events",
api_method="list",
response_field="items",
singleEvents=True,
timeMin=now,
orderBy="startTime",
calendarId="primary"))
if r is not None:
if role == "organizer":
for event in r:
if (("organizer" in event) and
(("self" in event["organizer"] and event["organizer"]["self"]) or
(event["organizer"]["email"] == user_email))):
if ("recurringEventId" in event):
events.append(event["recurringEventId"])
else:
events.append(event["id"])
elif role == "attendee":
for event in r:
if (("organizer" in event) and
(("self" not in event["organizer"]) or
(event["organizer"]["email"] != user_email))):
if ("recurringEventId" in event):
events.append(event["recurringEventId"])
else:
events.append(event["id"])
elif role == "owned_single_event":
for event in r:
if (("organizer" in event) and
(("self" in event["organizer"] and event["organizer"]["self"]) or
(event["organizer"]["email"] == user_email))):
if ("recurringEventId" not in event):
events.append(event["id"])
return list(set(events))
def move_calendar_ownership(self, owner_calendar_id):
acl = {
"kind": "calendar#aclRule",
"scope": {
"type": "user",
"value": owner_calendar_id
},
"role": "owner"
}
try:
r = json.loads(self.call_google_api(service=self.service,
api_resource="acl",
api_method="insert",
response_field=None,
calendarId="primary",
body=acl))
return r
except(ValueError, KeyError, TypeError):
return None
def move_event(self, event_id, destination_calendar_id):
"""
Change calendar event owner.
:param event_id: eventId
:param destination_calendar_id: destination
:return: bool
"""
try:
r = json.loads(self.call_google_api(service=self.service,
api_resource="events",
api_method="move",
response_field="id",
calendarId="primary",
eventId=event_id,
destination=destination_calendar_id))
if r == event_id:
return True
else:
return False
except(ValueError, KeyError, TypeError):
return None
def delete_event(self, event_id):
"""
Remove user from a calendar event.
:param event_id: eventId
:return: empty response when successful
"""
try:
r = json.loads(self.call_google_api(service=self.service,
api_resource="events",
api_method="delete",
response_field=None,
calendarId="primary",
eventId=event_id,
sendNotifications=False))
if r is None:
return True
else:
return False
except(ValueError, KeyError, TypeError):
return False
def remove_events_attendance(self, user_email):
"""
Deletes events a user owns from their calendar.
:param user_email: user_email
:return: list of event_ids removed.
"""
events = self.list_events(user_email=user_email, role="owned_single_event")
events_removed = []
if events:
for event in events:
res = self.delete_event(event_id=event)
if res:
events_removed.append(event)
return events_removed
def decline_event(self, event_id, user_email):
"""
Declines event.
:param event_id: eventId
:param user_email: user_email
:return: event details
"""
patch_body = {"attendees": [{"responseStatus": "declined", "email": user_email}]}
try:
r = json.loads(self.call_google_api(service=self.service,
api_resource="events",
api_method="patch",
response_field="attendees",
calendarId="primary",
eventId=event_id,
sendNotifications=False,
body=patch_body))
return r
except(ValueError, KeyError, TypeError):
return None
def decline_events_attendance(self, user_email):
"""
Declines all events from a user's calendar.
:param user_email: userEmail
:return: list of event_ids removed
"""
events = self.list_events(user_email=user_email, role="attendee")
events_declined = []
if events:
for event in events:
res = self.decline_event(event_id=event, user_email=user_email)
if res:
events_declined.append(event)
return events_declined
def get_event_rule(self, event_id):
"""
Gets the recurrence rrule value for an event.
:param event_id: eventId
:return: Recurrence rule as a list
"""
try:
r = json.loads(self.call_google_api(service=self.service,
api_resource="events",
api_method="get",
response_field="recurrence",
calendarId="primary",
eventId=event_id))
return r
except(ValueError, KeyError, TypeError):
return None
def cancel_recurrence(self, event_id, new_event_rule):
"""
Updates event recurrence rule to cancel future instances.
:param event_id: eventId
:param new_event_rule: body
:return: list of canceled event ids.
"""
patch_body = {
"recurrence": new_event_rule
}
try:
r = json.loads(self.call_google_api(service=self.service,
api_resource="events",
api_method="patch",
response_field="id",
calendarId="primary",
eventId=event_id,
sendNotifications=False,
body=patch_body))
return r
except(ValueError, KeyError, TypeError):
return None
def remove_recurring_instances(self, user_email):
"""
Cancels future event instances from a users calendar.
:param user_email: user_email
:return: list of canceled event ids.
"""
updated_events = []
recurring_events_list = self.list_events(user_email)
if recurring_events_list:
for event in recurring_events_list:
event_rule = self.get_event_rule(event)
if event_rule:
new_event_rule = HelperFunctions.updated_event_rule(event_rule)
updated_event = self.cancel_recurrence(event, new_event_rule)
updated_events.append(updated_event)
return updated_events
else:
return None
def remove_future_events(self, user_email):
"""
Removes attendance from future events, and cancels recurring events.
:param self:
:param user_email:
:return: set of cancelled event ids.
"""
cancelled_events = []
cancelled_events.append(self.remove_events_attendance(user_email))
cancelled_events.append(self.remove_recurring_instances(user_email))
cancelled_events.append(self.decline_events_attendance(user_email))
return cancelled_events