Ejemplo n.º 1
0
    def get_current_event(content: str, include_all_day: bool):
        now = datetime.now().astimezone()
        events = icalparser.parse_events(content=content)
        if events is None:
            return None

        temp_event = None
        for event in events:
            if event.all_day and not include_all_day:
                continue
            else:
                event.start = event.start.astimezone()
                event.end = event.end.astimezone()

            if (event.end >= now) and (
                temp_event is None or event.start < temp_event.start
            ):
                temp_event = event

        if temp_event is None:
            return None

        return {
            "summary": temp_event.summary,
            "start": parser_icalevents.get_hass_date(
                temp_event.start, temp_event.all_day
            ),
            "end": parser_icalevents.get_hass_date(temp_event.end, temp_event.all_day),
            "location": temp_event.location,
            "description": temp_event.description,
        }
Ejemplo n.º 2
0
    def get_event_list(content: str, start, end, include_all_day: bool):
        event_list = []
        events = icalparser.parse_events(content=content, start=start, end=end)
        if events is not None:
            for event in events:
                if event.all_day and not include_all_day:
                    continue
                uid = None
                if hasattr(event, "uid") and event.uid != -1:
                    uid = event.uid
                data = {
                    "uid": uid,
                    "summary": event.summary,
                    "start": parser_icalevents.get_date_formatted(
                        event.start.astimezone(), event.all_day
                    ),
                    "end": parser_icalevents.get_date_formatted(
                        event.end.astimezone(), event.all_day
                    ),
                    "location": event.location,
                    "description": event.description,
                }
                # Note that we return a formatted date for start and end here,
                # but a different format for get_current_event!
                event_list.append(data)

        return event_list
Ejemplo n.º 3
0
    async def async_get_events(self, hass, start_date, end_date):
        """Get all events in a specific time frame."""
        event_list = []
        calendar_data = await hass.async_add_job(self._downloadCalendar)
        events = None
        try:
            events = icalparser.parse_events(content=calendar_data, start=start_date, end=end_date)
        except:
            _LOGGER.error("%s: Failed to parse ICS!", self.name)
        if events is not None:
            for event in events:
                if event.all_day and not self.include_all_day:
                    continue
                uid = None
                if hasattr(event, 'uid') and event.uid != -1:
                    uid = event.uid
                data = {
                    'uid': uid,
                    'summary': event.summary,
                    'start': self.get_date_formatted(event.start.astimezone(), event.all_day),
                    'end': self.get_date_formatted(event.end.astimezone(), event.all_day),
                    'location': event.location,
                    'description': event.description
                }
                # Note that we return a formatted date for start and end here,
                # but a different format for self.event!
                event_list.append(data)

        return event_list
    def get_persons(self, date):
        date = lmdutils.get_date_ymd(date)
        if date in self.cache:
            return self.cache[date]

        res = parse_events(self.cal, start=date, end=date)
        self.cache[date] = res = [
            (p.summary, self.people.get_bzmail_from_name(p.summary)) for p in res
        ]

        return res
Ejemplo n.º 5
0
    def get_persons(self, date):
        date = lmdutils.get_date_ymd(date)
        date += relativedelta(seconds=1)
        date = date.replace(tzinfo=self.cal_tz)
        if date in self.cache:
            return self.cache[date]

        res = parse_events(self.cal, start=date, end=date)
        self.cache[date] = res = [(p.summary,
                                   self.people.get_bzmail_from_name(p.summary))
                                  for p in res]

        return res
    def get_persons(self, date):
        date = lmdutils.get_date_ymd(date)
        date += relativedelta(seconds=1)
        date = date.replace(tzinfo=self.cal_tz)
        if date in self.cache:
            return self.cache[date]

        res = parse_events(self.cal, start=date, end=date)
        self.cache[date] = res = [
            (p.summary, self.people.get_bzmail_from_name(p.summary)) for p in res
        ]

        return res
Ejemplo n.º 7
0
def events_at(time):
    for name in calendars:
        calendar = get_calendar(name)

        # Vemos si podemos usar los eventos en caché o tenemos que parsear raw
        if calendar[1] - calendar[2] <= time <= calendar[1] + calendar[2]:
            events_gen = (e for e in calendar[0] if e.start <= time <= e.end)
        else:
            events_gen = (e for e in icalparser.parse_events(
                calendar[3], start=time, end=time))
        events = repeat_next(events_gen)

        if next(events, None) is None:
            yield '[%s] No tiene nada reservado' % name

        for event in events:
            yield '[%s] %s' % (name, event.summary)
Ejemplo n.º 8
0
def get_ics_events(files=None, remove_duplicates=True, days=30):
    events_dict = {}
    for ics_file in tqdm(files,
                         total=len(files),
                         desc=" Loading events from ics files"):

        # open the file and parse ics calendar to list of events
        try:
            with open(ics_file) as f:
                events_list = parse_events(
                    f.read(), default_span=datetime.timedelta(days=days))
        except Exception as e:
            print(ics_file)
            raise e

        # loop through all events in calendar
        for new_event in events_list:
            # add file field
            new_event.file = ics_file

            # if "Lunch" in new_event.summary:
            #     print()
            #     print(new_event, new_event.file, new_event.status)
            #     print(dir(new_event))
            #     print(new_event.uid.split("_")[0])
            #     print(new_event.recurrence_id)

            # continue if uid already exists in dictionary
            if new_event.uid in events_dict:
                continue

            if remove_duplicates:
                # check if duplicate of event already exists (has different uid though)
                duplicate = check_duplicate_event(new_event, events_dict)

            events_dict, duplicate = check_modified_recurring_event(
                new_event, events_dict)

            if duplicate:
                continue

            # only add event uids that aren't duplicated
            events_dict[new_event.uid] = new_event

    return events_dict
Ejemplo n.º 9
0
def load_calendar(name, retries=3):
    url = urls[name]

    while retries > 0:
        try:
            now = aware_now()
            span = timedelta(weeks=4)
            calendar_raw = icaldownload.ICalDownload().data_from_url(url)
            events = icalparser.parse_events(calendar_raw,
                                             start=now - span,
                                             end=now + span)
            calendars[name] = (events, now, span, calendar_raw)
            return calendars[name]
        except Exception:
            retries -= 1

    # Debería levantar una excepción?
    return None
Ejemplo n.º 10
0
    def update(self):
        """Get the latest data."""
        now = datetime.now().astimezone()
        calendar_data = self._downloadCalendar()
        events = None
        try:
            events = icalparser.parse_events(content=calendar_data, end=now)
        except:
            _LOGGER.error("%s: Failed to parse ICS!", self.name)
        if events is not None:
            temp_event = None
            for event in events:
                if event.all_day and not self.include_all_day:
                    continue
                else:
                    event.start = event.start.astimezone()
                    event.end = event.end.astimezone()
                    # This first case probably isn't needed; when writing this
                    # code, I noticed that if an event hasn't started yet, it
                    # won't be returned at all.  I've left the condition in,
                    # just in case that changes in the future.
                    if event.start > now or event.end < now:
                        continue
                if temp_event is None:
                    temp_event = event
                elif temp_event.end > event.end:
                    temp_event = event

            if temp_event is None:
                self.event = None
                return True

            self.event = {
                'summary': temp_event.summary,
                'start': self.get_hass_date(temp_event.start, temp_event.all_day),
                'end': self.get_hass_date(temp_event.end, temp_event.all_day),
                'location': temp_event.location,
                'description': temp_event.description
            }
            return True

        return False
Ejemplo n.º 11
0
        print("The configuration file must contain at least a calendar key",
              file=sys.stderr)
        sys.exit(1)
    update_freq = int(cal.get("update_frequency", 15))
    sleep_seconds = update_freq * 60
    sch = None
    if sch_proc is not None:
        print("Kill process")
        sch_proc.terminate()
    try:
        client = caldav.DAVClient(url, username=user, password=password)
        principal = client.principal()
    except OSError:
        print("Calendar fetch failed. Retrying in {} seconds.".format(
            sleep_seconds),
              file=sys.stderr)
        time.sleep(sleep_seconds)
    future_events = []
    next_minute = datetime.now(pytz.utc) + timedelta(minutes=1)
    for calendar in principal.calendars():
        for event in calendar.events():
            url = str(event.url)
            url_base = url[url.rfind("/") + 1:]
            ical_text = event.data
            future_events += parse_events(ical_text, start=next_minute)
    sch = sched.scheduler(lambda: datetime.now(pytz.utc), sleep_fun)
    schedule.populate_scheduler(sch, future_events, conf)
    sch_proc = Process(target=schedule.schedule_proc, args=(sch, ))
    sch_proc.start()
    time.sleep(sleep_seconds)