Source code for i3pystatus.calendar.khal_calendar

from datetime import date, timedelta

import khal
import khal.cli
import khal.settings
from i3pystatus.calendar import CalendarBackend, CalendarEvent, formatter


class KhalEvent(CalendarEvent):
    def __init__(self, khal_event):
        self.id = khal_event.uid
        self.start = khal_event.start_local
        self.end = khal_event.end_local
        self.title = khal_event.summary
        self.recurring = khal_event.recurring
        self._calendar = khal_event.calendar

    @formatter
    def calendar(self):
        return self._calendar


[docs]class Khal(CalendarBackend): """ Backend for Khal. Requires `khal` to be installed. .. rubric:: Available formatters * `{calendar}` — Calendar event is from. """ settings = ( ('config_path', 'Path to your khal.conf'), ('calendars', 'Restrict to these calendars pass as a list)'), ('days', 'Check for the next X days'), ) days = 7 config_path = None calendars = None def init(self): self.collection = None self.events = [] def open_connection(self): self.logger.debug("Opening collection with config {}".format(self.config_path)) config = khal.settings.get_config(self.config_path) self.collection = khal.cli.build_collection(config, None) def update(self): if self.collection is None: self.open_connection() events = [] for days in range(self.days): events += list(self.collection.get_events_on( date.today() + timedelta(days=days)) ) # filter out unwanted calendars self.logger.debug("calendars %s" % self.calendars) if self.calendars is not None: events = [evt for evt in events if evt.calendar in self.calendars] for event in events: self.events.append(KhalEvent(event))