docs: def get_events(self, start_time, end_time, ignore_cancelled = True, get_recurring_events_as_instances = True, restrict_to_calendars = []):
          '''A wrapper for events().list. Returns the events from the calendar within the specified times. Some of the interesting fields are:
                  description, end, htmlLink, location, organizer, start, summary
  
                  Note: "Cancelled instances of recurring events (but not the underlying recurring event) will still be included if showDeleted and singleEvents are both False."
          '''
          es = []
          calendar_ids = restrict_to_calendars or self.calendar_ids
          for calendar_id in calendar_ids:
              now = datetime.now(tz = self.timezone)
              events = []
              page_token = None
              while True:
                  events = self.service.events().list(pageToken=page_token, maxResults = 250, calendarId = self.configured_calendar_ids[calendar_id], timeMin = start_time, timeMax = end_time, showDeleted = False).execute()
                  for event in events['items']:
                      dt = None
                      nb = DeepNonStrictNestedBunch(event)
                      assert(not(nb._event))
                      nb._event = event # keep the original event as returned in case we want to reuse it e.g. insert it into another calendar
                      if (not ignore_cancelled) or (nb.status != 'cancelled'):
                          # Ignore cancelled events
                          if nb.recurrence:
                              if get_recurring_events_as_instances:
                                  # Retrieve all occurrences of the recurring event within the timeframe
                                  es += self.get_recurring_events(calendar_id, nb.id, start_time, end_time)
                              else:
                                  es.append(nb)
                          elif nb.start.dateTime:
                              dt = dateutil.parser.parse(nb.start.dateTime)
                          elif nb.start.date:
                              dt = dateutil.parser.parse(nb.start.date)
                              dt = datetime(year = dt.year, month = dt.month, day = dt.day, hour=0, minute=0, second=0, tzinfo=self.timezone)
                          if dt:
                              nb.datetime_o = dt
                              nb.calendar_id = calendar_id
                              es.append(nb)
                  page_token = events.get('nextPageToken')
                  if not page_token:
                      break
  
          es.sort(key=lambda x: x.datetime_o)
          return es