def get_event_duration(event, default=datetime.timedelta(hours=1)): """ Return the duration of the event (as a timedelta object) """ if event is None: return default try: start = parse_date(event['start']['dateTime']) end = parse_date(event['start']['endTime']) except (KeyError, ValueError): return default if end < start: return default return end - start
def task_from_data(self, data, extra): """ We sync back only due_date and date_string. """ if isinstance(data, Task): # if it's a task object, we don't have to convert anything # we use it to delete the task return data try: gcal_due_date = parse_date(data['start']['dateTime']) except (KeyError, ValueError): # an event without a due date (whole day event maybe). Skip return # if the task is new, we should fill in the content if not extra: plaintext = data.get('summary') or 'Google Calendar event' backlink = data['htmlLink'] content = '%s (%s)' % (backlink, plaintext) else: content = undefined # sync due date and date string, but # don't overwrite "Todoist rich date strings" due_date_utc = gcal_due_date.astimezone(pytz.utc) user_timezone = self.bridge.integration.user.get_timezone() local_due_date = gcal_due_date.astimezone(user_timezone) date_string = local_due_date.strftime('%d %b %Y at %H:%M') original_due_date = extra.get('original_due_date') if due_date_utc.replace(tzinfo=None) == original_due_date: due_date_utc = undefined date_string = undefined return task(content=content, due_date=due_date_utc, date_string=date_string)