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 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')