def install(self): service = self.setup_service() self.user_regex = compile(self.options.get('user_regex', '.*')) feed = service.GetOwnCalendarsFeed() csv_filename = self.options.get('csv_filename', 'temp.csv') csvwriter = writer(open(csv_filename, 'wb')) # keep the header in sync with event_details csvwriter.writerow(self.headers) for i, calendar in enumerate(feed.entry): # is there no other way to get the 'user' of a feed? user = unquote(calendar.content.src.split('/')[5]) print '%s. %r\t%r\t%r\t%r' % (i, calendar.title.text, calendar.timezone.value, calendar.hidden.value, user) query = CalendarEventQuery(user) if 'start_min' in self.options: query.start_min = self.options['start_min'] if 'start_max' in self.options: query.start_max = self.options['start_max'] query.max_results = self.options.get('max_results', '500') events_feed = service.CalendarQuery(query) print ' %r' % (len(events_feed.entry),) assert len(events_feed.entry) < int(query.max_results) for event in events_feed.entry: # skip recurrent event because they are too ambiguous if event.recurrence: print 'Skip: recurrent event %r' % event.title.text continue for event_row in self.event_details(event): csvwriter.writerow([calendar.title.text] + event_row) self.buildout.namespace['google_calendar'] = {'csv_filename': csv_filename} return tuple()
def fetch_events(): username = '******' visibility = 'private-fa3dc4aa8a14f7da0099eb6fb34a036a' query = CalendarEventQuery(username, visibility) query.sortorder = 'a' query.futureevents = 'true' query.orderby = 'starttime' calendar_service = CalendarService() feed = calendar_service.CalendarQuery(query) return [{'title':item.title.text, 'start_time':parse(item.when[0].start_time), 'end_time':parse(item.when[0].end_time), 'location':item.where[0].value_string} for item in feed.entry]
def dateQuery(client, calendarName, start_date, end_date, **kwargs): """ Retrieves events from the server which occur during the specified date range. **kwargs may be specified to enhance the query """ query = CalendarEventQuery(calendarName, 'private', 'full') query.update(kwargs) query.start_min = start_date query.start_max = end_date return client.CalendarQuery(query)
def query(self, start_date, end_date, calendar='default'): query = CalendarEventQuery(calendar, 'private', 'full') query.start_min = str(start_date) query.start_max = str(end_date) logging.getLogger(__name__).info( "Querying Google Calendar %s." % calendar) try: return self.calendar_service.CalendarQuery(query) except NotAuthenticated: # pragma: no cover try: self.login() except BadAuthentication: pass else: return self.query(start_date, end_date)
def query(self, start_date, end_date, calendar='default'): query = CalendarEventQuery(calendar, 'private', 'full') query.start_min = str(start_date) query.start_max = str(end_date) logging.getLogger(__name__).info("Querying Google Calendar %s." % calendar) try: return self.calendar_service.CalendarQuery(query) except NotAuthenticated: # pragma: no cover try: self.login() except BadAuthentication: pass else: return self.query(start_date, end_date)
def _get_parser(self): calendar_service = CalendarService() yesterday = datetime.today() - timedelta(days = 1) three_months = yesterday + timedelta(days = 90) query = CalendarEventQuery(self.calendar_id(), 'public', 'full') query.start_min = yesterday.strftime('%F') query.start_max = three_months.strftime('%F') query['max-results'] = '500' feed = calendar_service.CalendarQuery(query) start_date = lambda e: date_util.parse_date_time(e.when[0].start_time).date() single = [] recurring = [] for e in feed.entry: if len(e.when) > 1: recurring.append(e) else: single.append(e) for show in self._process_recurring_entries(recurring): if show: yield show if self.group_by_date(): single.sort(key = start_date) for batch_date, date_entries in groupby(single, start_date): for show in self._process_entry_group(batch_date, list(date_entries)): if show: pass yield show else: for entry in single: show = self._process_entry(entry) if show: yield show
def update_events(self, since_date, until_date): print 'Update events:', since_date, 'until', until_date # Timestamps since = int(mktime(since_date.timetuple())) until = int(mktime(until_date.timetuple())) # Clear old events key = (since, until) self.events[key] = [] # Get events from all calendars for calendar, feed_url in self.calendars: print 'Getting events from', calendar, '...' query = CalendarEventQuery() query.feed = feed_url query.start_min = since_date.strftime('%Y-%m-%d') query.start_max = until_date.strftime('%Y-%m-%d') feed = self.client.CalendarQuery(query) for event in feed.entry: event_id = event.id.text title = event.title.text print ' ', title for when in event.when: print ' ', when.start_time, 'to', when.end_time allday = False start, allday = self.parse_time(when.start_time) end, _ = self.parse_time(when.end_time) if (start >= since and start < until) or \ (start <= since and (end - 1) > since): e = Event(event_id, title, start, end, allday) self.events[key].append(e) else: print '!!! Outside range !!!' print '#Events:', len(self.events[key])
def upcoming_events(days=90): # Create a Google Calendar client to talk to the Google Calendar service. calendar_client = CalendarService() # Set up a query with the GCAL_ID. query = CalendarEventQuery(app.config['GCAL_ID'], 'public', 'full') query.orderby = 'starttime' query.sortorder = 'descending' # we're interested in events in the next 60 days if we wanted all the # futuer events, we'd use query.futureevents='true' and ignore the # start_min, start_max options month_offset = timedelta(days=days) start_min = _now() start_max = start_min + month_offset query.start_min = start_min.isoformat() query.start_max = start_max.isoformat() # query gcal for the time interval return list(reversed([CalendarEvent(e) for e in calendar_client.CalendarQuery(query).entry]))
def update_months_events(self, probe_date, in_thread=False, months_back=12, months_ahead=12): if in_thread: prefix = ' <<<<THREAD>>>> ' else: prefix = ' ' print prefix, 'Update months events around:',\ probe_date.strftime('%B %Y'), '| months_back', months_back,\ '| months_ahead', months_ahead months = {} # init asked month events key = initial_month_key = get_month_key(probe_date) months[key] = MonthEvents(key, []) # init previous months events for i in range(0, months_back): key = months[key].get_prev_month_key() months[key] = MonthEvents(key, []) # date for google query start limit min_date = months[key].get_start_date() # init next months events key = initial_month_key for i in range(0, months_ahead): key = months[key].get_next_month_key() months[key] = MonthEvents(key, []) # date for google query end limit max_date = months[key].get_end_date() # Get events from all calendars for calendar_title, feed_url in self.calendars: print prefix, 'Getting events from', calendar_title, '...' query = CalendarEventQuery() query.feed = feed_url query.start_min = min_date.strftime('%Y-%m-%d') query.start_max = max_date.strftime('%Y-%m-%d') query.max_results = 2**31 - 1 feed = self.client.CalendarQuery(query) for event in feed.entry: event_id = event.id.text title = event.title.text if debug: print '%s Event: title=%s' % (prefix, repr(title)) for when in event.when: if debug: print '%s start_time=%s end_time=%s' % ( prefix, repr(when.start_time), repr(when.end_time)) allday = False start, allday = self.parse_time(when.start_time) end = self.parse_time(when.end_time)[0] e = Event(event_id, title, start, end, allday, calendar_title) for month in months.values(): month.add_event(e) # Replace old months events by new ones # TODO repair deletion if python doesn't do it for key, month in months.items(): month.updated() # print '!' # self.months[key].delete() # print '!' # del self.months[key] self.months[key] = month print prefix, '#Updated events since', \ (min_date + timedelta(days=10)).strftime('%B %Y'), \ 'until', (max_date - timedelta(days=10)).strftime('%B %Y')
def update_months_events(self, probe_date, in_thread=False, months_back=12, months_ahead=12): if in_thread: prefix = ' <<<<THREAD>>>> ' else: prefix = ' ' print prefix, 'Update months events around:',\ probe_date.strftime('%B %Y'), '| months_back', months_back,\ '| months_ahead', months_ahead months = {} # init asked month events key = initial_month_key = get_month_key(probe_date) months[key] = MonthEvents(key, []) # init previous months events for i in range(0, months_back): key = months[key].get_prev_month_key() months[key] = MonthEvents(key, []) # date for google query start limit min_date = months[key].get_start_date() # init next months events key = initial_month_key for i in range(0, months_ahead): key = months[key].get_next_month_key() months[key] = MonthEvents(key, []) # date for google query end limit max_date = months[key].get_end_date() # Get events from all calendars for calendar_title, feed_url in self.calendars: print prefix, 'Getting events from', calendar_title, '...' query = CalendarEventQuery() query.feed = feed_url query.start_min = min_date.strftime('%Y-%m-%d') query.start_max = max_date.strftime('%Y-%m-%d') query.max_results = 2**31-1 feed = self.client.CalendarQuery(query) for event in feed.entry: event_id = event.id.text title = event.title.text if debug: print '%s Event: title=%s' % ( prefix, repr(title) ) for when in event.when: if debug: print '%s start_time=%s end_time=%s' % ( prefix, repr(when.start_time), repr(when.end_time) ) allday = False start, allday = self.parse_time(when.start_time) end = self.parse_time(when.end_time)[0] e = Event(event_id, title, start, end, allday, calendar_title) for month in months.values(): month.add_event(e) # Replace old months events by new ones # TODO repair deletion if python doesn't do it for key, month in months.items(): month.updated() # print '!' # self.months[key].delete() # print '!' # del self.months[key] self.months[key] = month print prefix, '#Updated events since', \ (min_date + timedelta(days=10)).strftime('%B %Y'), \ 'until', (max_date - timedelta(days=10)).strftime('%B %Y')