Source code for i3pystatus.calendar.lightning

import sqlite3
from datetime import datetime

import pytz
from dateutil.tz import tzlocal
from i3pystatus.calendar import CalendarEvent, CalendarBackend, formatter


class Flag:
    PRIVATE = 1
    HAS_ATTENDEES = 2
    HAS_PROPERTIES = 4
    EVENT_ALLDAY = 8
    HAS_RECURRENCE = 16
    HAS_EXCEPTIONS = 32
    HAS_ATTACHMENTS = 64
    HAS_RELATIONS = 128
    HAS_ALARMS = 256
    RECURRENCE_ID_ALLDAY = 512


class LightningCalendarEvent(CalendarEvent):
    def __init__(self, row):
        self.id = row['id']
        self.title = row['title']
        self._event_start = row['event_start']
        self._event_start_tz = row['event_start_tz']
        self._event_end = row['event_end']
        self._event_end_tz = row['event_end_tz']
        self._flags = row['flags']
        self._location = row['location'] or ''

    @property
    def recurring(self):
        return (self._flags & Flag.HAS_RECURRENCE) != 0

    @property
    def end(self):
        return self._convert_date(self._event_end, self._event_end_tz)

    @property
    def start(self):
        return self._convert_date(self._event_start, self._event_start_tz)

    @formatter
    def location(self):
        return self._location

    def _convert_date(self, microseconds_from_epoch, timezone):
        if timezone == 'floating':
            tz = tzlocal()
        else:
            tz = pytz.timezone(timezone)
        d = datetime.fromtimestamp(microseconds_from_epoch / 1000000, tz=pytz.UTC)
        return d.astimezone(tz)


[docs]class Lightning(CalendarBackend): """ Backend for querying the Thunderbird's Lightning database. Requires `pytz` and `dateutil`. .. rubric:: Available formatters * `{location}` — Where the event occurs """ settings = ( ('database_path', 'Path to local.sqlite.'), ('days', 'Only show events between now and this many days in the future'), ) required = ('database_path',) days = 7 database_path = None def update(self): with sqlite3.connect(self.database_path) as connection: connection.row_factory = sqlite3.Row cursor = connection.cursor() cursor.execute(""" SELECT id, title, event_start, event_start_tz, event_end, event_end_tz, flags, cal_properties.value AS location FROM cal_events LEFT OUTER JOIN cal_properties ON cal_properties.item_id = id AND cal_properties.key = 'LOCATION' WHERE datetime(event_start / 1000000, 'unixepoch', 'localtime') < datetime('now', 'localtime', '+' || :days || ' days') AND datetime(event_start / 1000000, 'unixepoch', 'localtime') > datetime('now', 'localtime') ORDER BY event_start ASC """, dict(days=self.days)) self.events.clear() for row in cursor: self.events.append(LightningCalendarEvent(row)) cursor.close()